Coder Social home page Coder Social logo

imagefileselector's Introduction

ImageFileSelector

轻量级的选取图片和裁切图片的库,使用系统自带的软件实现。

支持Android版本 Api Level >= 16

使用方法

implementation 'com.sw926.imagefileselector:library:2.0.0'

在 Activity 或者 Fragment Start 之前进行初始化:

mImageFileSelector = new ImageFileSelector(this);
mImageFileSelector.setOutPutImageSize(w, h);
mImageFileSelector.setQuality(80);
mImageFileSelector.setListener(new ImageFileResultListener() {
    @Override
    public void onSuccess(@NonNull String filePath) {
        loadImage(filePath);
        mCurrentSelectFile = new File(filePath);
        mBtnCrop.setVisibility(View.VISIBLE);
    }

    @Override
    public void onCancel() {
        Toast.makeText(ExampleActivity.this, "Canceled", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onError() {
        Toast.makeText(ExampleActivity.this, "Unknown Error", Toast.LENGTH_LONG).show();
    }
});

在选择图片的地方调用:

mImageFileSelector.takePhoto();
// 或者
mImageFileSelector.selectImage();

说明

在 appcompat 支持 ActivityResultLauncher 后,选择图片已经非常简单,这个项目只是做了简单的封装,添加了拍照和图片压缩。选择图片不需要任何权限,如果 App 的 AndroidManifest.xml 没有添加 <uses-permission android:name="android.permission.CAMERA" /> ,拍照也不需要申请权限。

imagefileselector's People

Contributors

sw926 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

imagefileselector's Issues

Fatal Exception: java.lang.RuntimeException: Failure delivering result-permission android.permission.CAMERA

Fatal Exception: java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=103, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {net.jayamsoft.vcr/com.ecommifier.vcr.chat.EnquiryChatActivity}: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:content://media/external/images/media/2585} (has extras) } from ProcessRecord{c283ab3 3880:net.jayamsoft.vcr/u0a174} (pid=3880, uid=10174) with revoked permission android.permission.CAMERA
at android.app.ActivityThread.deliverResults(ActivityThread.java:3714)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3757)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5468)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:671)
Caused by java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:content://media/external/images/media/2585} (has extras) } from ProcessRecord{c283ab3 3880:net.jayamsoft.vcr/u0a174} (pid=3880, uid=10174) with revoked permission android.permission.CAMERA
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2730)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1510)
at android.app.Activity.startActivityForResult(Activity.java:3930)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3890)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at com.sw926.imagefileselector.ImageCaptureHelper.capture(ImageCaptureHelper.java:166)
at com.sw926.imagefileselector.ImageCaptureHelper.onRequestPermissionsResult(ImageCaptureHelper.java:94)
at com.sw926.imagefileselector.ImageFileSelector.onRequestPermissionsResult(ImageFileSelector.java:122)
at com.ecommifier.vcr.chat.EnquiryChatActivity.onRequestPermissionsResult(EnquiryChatActivity.java:582)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
at android.app.Activity.dispatchActivityResult(Activity.java:6460)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3710)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3757)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5468)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:671)

FileUriExposedException

It throw FileUriExposedException on Android N!
I solved this issue by replacing
uri = Uri.fromFile(mTempFile);

with

ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, srcFile.getAbsolutePath());
Uri uri = ((Context)mHolder).getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);

in ImageCropper.java

ImageCompressHelper Issues

public void compress(String fileName, boolean deleteSrc) {
if (mMaxHeight <= 0 || mMaxWidth <= 0) {
if (mCallback != null) {
File outputFile = CommonUtils.generateExternalImageCacheFile(mContext, ".jpg");
CommonUtils.copy(new File(fileName), outputFile);
mCallback.onCallBack(outputFile.getAbsolutePath());
}
} else {
ImageFile srcImageFile = new ImageFile(fileName, deleteSrc);
new CompressTask().execute(srcImageFile);
}
}

不要用execute 会照成回调不及时······

java.lang.SecurityException Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=13846, uid=10326 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

The library does not check correctly if app has the needed permission.
For selecting image from gallery, in method selectorImage you are calling mPermissionsHelper.checkAndRequestPermission and pass the permission Manifest.permission.READ_EXTERNAL_STORAGE as parameter to be checked. Inside this method, if android version is greater than M, you are doing a check calling isHavePermissions but in this method you do not pass further the permission which is being checked.

As result, the app crashes after selecting picture from Gallery.

android.os.Parcel.readException (Parcel.java:2004)

  | android.content.ContentResolver.query (ContentResolver.java:662)
  | com.sw926.imagefileselector.Compatibility.getDataColumn (Compatibility.java:117)
  | com.sw926.imagefileselector.Compatibility.getPath (Compatibility.java:77)
  | com.sw926.imagefileselector.ImagePickHelper.onActivityResult (ImagePickHelper.java:150)
  | com.sw926.imagefileselector.ImageFileSelector.onActivityResult (ImageFileSelector.java:99)

Remove Kotlin

Kotlin运行库和stdlib有点大,还是乖乖的使用Java吧

There is no support of fragment

  1. Please add
    public void takePhoto(Fragment fragment)
    and
    public void selectorImage(Fragment fragment)
    to the ImageFileSelector class
    to call fragment.startActivityForResult

since if you call activity.startActivityForResult we will never get a callback onActivityResult in our fragment
2) Is it possible to replace all comments and docs with English words

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.