yancyye / gallerypick Goto Github PK
View Code? Open in Web Editor NEWAndroid 图片选择器。
Android 图片选择器。
我们在调用的时候用到这个方法,其中galleryConfig是由GalleryConfig.build出来的,注意到他是一个静态的对象,所以所有的galleryConfig其实就是共用的一个对象;
我若在MainActivity里面设置了一个全局变量类似下面这个:
private GalleryConfig galleryConfig = new GalleryConfig.Builder()
.imageLoader(new GlideImageLoader()) // ImageLoader 加载框架(必填)
.iHandlerCallBack(iHandlerCallBack) // 监听接口(必填)
.provider("minihou.net.homeschoolconnect.fileprovider") // provider (必填)
.pathList(listPath) // 记录已选的图片
.crop(true) // 快捷开启裁剪功能,仅当单选 或直接开启相机时有效
.isShowCamera(true) // 是否现实相机按钮 默认:false
.filePath("/Gallery/Pictures") // 图片存放路径
.build();
然后我去下一个页面 又设置了一个galleryConfigNew:
private GalleryConfig galleryConfigNew = new GalleryConfig.Builder()
.imageLoader(new GlideImageLoader()) // ImageLoader 加载框架(必填)
.iHandlerCallBack(iHandlerCallBack) // 监听接口(必填)
.provider("minihou.net.homeschoolconnect.fileprovider") // provider (必填)
.pathList(listPath) // 记录已选的图片
.crop(true) // 快捷开启裁剪功能,仅当单选 或直接开启相机时有效
.isShowCamera(true) // 是否现实相机按钮 默认:false
.filePath("/Gallery/Pictures") // 图片存放路径
.build();
你会发现这个galleryConfigNew和我上一个页面的galleryConfig是一个对象。然而此时我的galleryConfigNew的配置项已经发生改变。
我按返回键回到我的上一个页面,因为我刚才在下一个页面已经改变了这个config,那么此时我这个页面的galleryConfig已经发生了变化,我必须要重置,否则配置已经发生变化。
RT,在选择图片完成后,再次选择时,不想记录之前已选的图片,希望重新选择所有图片,请问应该怎么办?
多次点击完成返回多次重复数据
裁剪开启与否并没有效果 demo中
展示列数要怎么设置?
java.lang.NullPointerException: Attempt to invoke interface method 'boolean com.yancy.gallerypick.widget.GalleryImageView$OnImageViewListener.verifyDrawable(android.graphics.drawable.Drawable)' on a null object reference
at com.yancy.gallerypick.widget.GalleryImageView.verifyDrawable(GalleryImageView.java:48)
at android.view.View.invalidateDrawable(View.java:16684)
at android.widget.ImageView.invalidateDrawable(ImageView.java:244)
at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:408)
at android.graphics.drawable.Drawable.setBounds(Drawable.java:203)
at android.view.View.drawBackground(View.java:16277)
at android.view.View.draw(View.java:16051)
。。。。。无用调用栈
您有许可证选择计划吗?
5.0以上的系统没问题,4.0的系统上,报上述错误;
GalleryPickActivity.java的showCameraAction()函数,修改一下:
private void showCameraAction() {
// 跳转到系统照相机
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(mActivity.getPackageManager()) != null) {
// 设置系统相机拍照后的输出路径
// 创建临时文件
cameraTempFile = FileUtils.createTmpFile(mActivity, galleryConfig.getFilePath());
Uri imageUri = FileProvider.getUriForFile(mContext, "com.yancy.gallerypick.fileprovider", cameraTempFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
List<ResolveInfo> resInfoList = mContext.getPackageManager().queryIntentActivities(cameraIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
mContext.grantUriPermission(packageName, imageUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivityForResult(cameraIntent, REQUEST_CAMERA);
} else {
Toast.makeText(mContext, R.string.gallery_msg_no_camera, Toast.LENGTH_SHORT).show();
galleryConfig.getIHandlerCallBack().onError();
}
}
通过MAT查看内存,发现使用图片选择器的那个Activity没有销毁,通过MAT查看引用com.yancy.gallerypick.config.GalleryConfig.Builder这个类没有释放
public GalleryConfig build() {
if (galleryConfig == null) {
galleryConfig = new GalleryConfig(this);
} else {
galleryConfig.setBuilder(this);
}
return galleryConfig;
}
是否是这里有循环引用造成的还是其它问题
要是加上选择视频 和 录制视频的就更完美了
看着写得很好,功能可以再扩展一些,建议开个QQ群方便讨论
找了好久 没找到关于动态图GIF的选择上传的问题 这个不支持GIF的动态图选择么
在华为手机上报出这个错误。。。
Unable to start activity ComponentInfo{com.yancy.gallerypick.activity.GalleryPickActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Gallery/Pictures/20180131120326.jpg
2个错误标记 获取不到设备内存的问题我设置成root-paht 也没有用
getSupportLoaderManager().restartLoader(LOADER_ALL, null, mLoaderCallback); // 扫描手机中的图片
这个在 androidx API30里面怎么处理
在5.0版本下,好像不能很好兼容
由于没有适配Android7.1 的缘故 , 拍照会有错误
小米5(android 7.0, API 24)在调用系统摄像头拍照后返回,有时会崩溃,但没有stacktrace,与正常调用不同的提示是下面一行:
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
使用酷派和乐视手机测试过,没有出现类似情况。
多谢解答~
直接启用相机可以加进去不,然后通过你的回调拿到图片
GalleryPickActivity中 返回键应该与完成键逻辑相同:
btnGalleryPickBack.setOnClickListener(new View.OnClickListener() {
@OverRide
public void onClick(View v) {
// 从完成键那边加过来的。。。
if (resultPhoto != null && resultPhoto.size() > 0) {
mHandlerCallBack.onSuccess(resultPhoto);
exit();
}
mHandlerCallBack.onCancel();
exit();
}
});
加载gif的时候很容易oom呢
很棒的项目,在学习中。现在我想在加载的时候自动选择一个小时内拍的图片,应该在哪里添加这个功能呢?
作者是否考虑将视频的选择也集成进取呢
Information:Gradle tasks [:app:generateDebugSources, :app:generateDebugAndroidTestSources]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preBetaBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2501Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72501Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2400Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCompat2501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCoreUi2501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCoreUtils2501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportFragment2501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportMediaCompat2501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42501Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2501Library UP-TO-DATE
:app:prepareComBigkooSvprogresshud102Library UP-TO-DATE
:app:prepareComDaimajiaSwipelayoutLibrary120Library UP-TO-DATE
:app:prepareComGithubYancyYeGalleryPick117Library UP-TO-DATE
:app:prepareComJakewhartonButterknife810Library UP-TO-DATE
:app:prepareComTencentBuglyCrashreport_upgrade123Library UP-TO-DATE
:app:prepareComTencentBuglyNativecrashreport312Library UP-TO-DATE
:app:prepareComYalantisUcrop220Library UP-TO-DATE
:app:prepareComYancyImageselectorImageselector130Library UP-TO-DATE
:app:prepareComZhyPercentSupportExtends111Library UP-TO-DATE
:app:prepareDeHdodenhofCircleimageview210Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources
:app:processDebugManifest
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:16:5-81 Warning:
Element uses-permission#android.permission.WRITE_EXTERNAL_STORAGE at AndroidManifest.xml:16:5-81 duplicated with element declared at AndroidManifest.xml:11:5-81
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:24:5-76 Warning:
Element uses-permission#android.permission.ACCESS_WIFI_STATE at AndroidManifest.xml:24:5-76 duplicated with element declared at AndroidManifest.xml:10:5-76
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:26:5-79 Warning:
Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:26:5-79 duplicated with element declared at AndroidManifest.xml:5:5-79
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:28:5-76 Warning:
Element uses-permission#android.permission.CHANGE_WIFI_STATE at AndroidManifest.xml:28:5-76 duplicated with element declared at AndroidManifest.xml:9:5-76
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:32:5-81 Warning:
Element uses-permission#android.permission.WRITE_EXTERNAL_STORAGE at AndroidManifest.xml:32:5-81 duplicated with element declared at AndroidManifest.xml:16:5-81
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:34:5-84 Warning:
Element uses-permission#android.permission.MOUNT_UNMOUNT_FILESYSTEMS at AndroidManifest.xml:34:5-84 duplicated with element declared at AndroidManifest.xml:15:5-84
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:37:5-75 Warning:
Element uses-permission#android.permission.READ_PHONE_STATE at AndroidManifest.xml:37:5-75 duplicated with element declared at AndroidManifest.xml:30:5-75
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:38:5-79 Warning:
Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:5-79 duplicated with element declared at AndroidManifest.xml:26:5-79
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:39:5-76 Warning:
Element uses-permission#android.permission.ACCESS_WIFI_STATE at AndroidManifest.xml:39:5-76 duplicated with element declared at AndroidManifest.xml:24:5-76
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:41:5-84 Warning:
Element uses-permission#android.permission.MOUNT_UNMOUNT_FILESYSTEMS at AndroidManifest.xml:41:5-84 duplicated with element declared at AndroidManifest.xml:34:5-84
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:42:5-81 Warning:
Element uses-permission#android.permission.WRITE_EXTERNAL_STORAGE at AndroidManifest.xml:42:5-81 duplicated with element declared at AndroidManifest.xml:32:5-81
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:47:5-75 Warning:
Element uses-permission#android.permission.READ_PHONE_STATE at AndroidManifest.xml:47:5-75 duplicated with element declared at AndroidManifest.xml:37:5-75
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:48:5-76 Warning:
Element uses-permission#android.permission.ACCESS_WIFI_STATE at AndroidManifest.xml:48:5-76 duplicated with element declared at AndroidManifest.xml:39:5-76
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:49:5-79 Warning:
Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:49:5-79 duplicated with element declared at AndroidManifest.xml:38:5-79
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:53:5-73 Warning:
Element uses-permission#android.permission.WRITE_SETTINGS at AndroidManifest.xml:53:5-73 duplicated with element declared at AndroidManifest.xml:12:5-73
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:55:5-68 Warning:
Element uses-permission#android.permission.WAKE_LOCK at AndroidManifest.xml:55:5-68 duplicated with element declared at AndroidManifest.xml:8:5-68
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:58:5-68 Warning:
Element uses-permission#android.permission.READ_LOGS at AndroidManifest.xml:58:5-68 duplicated with element declared at AndroidManifest.xml:40:5-68
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:61:5-68 Warning:
Element uses-permission#android.permission.BLUETOOTH at AndroidManifest.xml:61:5-68 duplicated with element declared at AndroidManifest.xml:13:5-68
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:244:13-64 Error:
Attribute provider#android.support.v4.content.FileProvider@authorities value=(com.sh_rw.shrenwei.fileProvider) from AndroidManifest.xml:244:13-64
is also present at [com.github.YancyYe:GalleryPick:1.1.7] AndroidManifest.xml:21:13-69 value=(com.yancy.gallerypick.fileprovider).
Suggestion: add 'tools:replace="android:authorities"' to element at AndroidManifest.xml:242:9-250:20 to override.
D:\duke\RW_Android\SHRenWei\app\src\main\AndroidManifest.xml:249:17-55 Error:
Attribute meta-data#android.support.FILE_PROVIDER_PATHS@resource value=(@xml/provider_paths) from AndroidManifest.xml:249:17-55
is also present at [com.github.YancyYe:GalleryPick:1.1.7] AndroidManifest.xml:26:17-50 value=(@xml/filepaths).
Suggestion: add 'tools:replace="android:resource"' to element at AndroidManifest.xml:247:13-249:57 to override.
See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.
:app:processDebugManifest FAILED
Error:Execution failed for task ':app:processDebugManifest'.
Manifest merger failed with multiple errors, see logs
Invalid image.
java.io.IOException: Invalid marker: 89
at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1616)
at android.media.ExifInterface.loadAttributes(ExifInterface.java:1341)
at android.media.ExifInterface.(ExifInterface.java:1058)
at com.yalantis.ucrop.task.BitmapCropTask.crop(BitmapCropTask.java:150)
at com.yalantis.ucrop.task.BitmapCropTask.doInBackground(BitmapCropTask.java:94)
at com.yalantis.ucrop.task.BitmapCropTask.doInBackground(BitmapCropTask.java:35)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
没有外部存储的时候,调用FileProvider.getUriForFile()方法会报错
在多选时,用相机拍完照后,把拍完的照片加到下面的列表中并选中。
FATAL EXCEPTION: main
Process: com.yancy.gallerypickdemo, PID: 6500 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yancy.gallerypickdemo/com.yancy.gallerypick.activity.GalleryPickActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.yancy.gallerypickdemo/cache/20170220200606.jpg
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2501)
at android.app.ActivityThread.access$1000(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5462)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.yancy.gallerypickdemo/cache/20170220200606.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
at com.yancy.gallerypick.activity.GalleryPickActivity.showCameraAction(GalleryPickActivity.java:332)
at com.yancy.gallerypick.activity.GalleryPickActivity.onCreate(GalleryPickActivity.java:99)
at android.app.Activity.performCreate(Activity.java:6303)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2394)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2501)
at android.app.ActivityThread.access$1000(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5462)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
log如上。是FileProvider的问题
建议可以加上图片压缩功能
应该再次弹出裁剪页面才对 但是没有 走了onError
大神你好,我写了一个自定义的组合控件,用来上传图片用的功能很简单就是ImageView和TextView的组合,在控件里使用了你的库,选择图片然后加载到ImageView上,现在问题是这样的,页面上有多个这种控件,选择图片后,图片总是加载到最后一个控件上,不管是点击那个控件都是响应在最后的控件上,不知道是什么原因?
自定义控件代码如下:
public class ImagePicker extends RelativeLayout implements View.OnClickListener {
private Context mContext;
private ImageView mImageView;//这个是要用来展示上传的图片的
private TextView mTextView;
private ImageView mIvEx;
private String mResIdEx;
private String mTitleText;
private float mTitleSize;
private int mTitleColor;
private Drawable mDrawableEx;
private String mImageUrl;
private PermissionsChecker mPermissionsChecker; // 权限检测器
// 所需的全部权限
static final String[] PERMISSIONS = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
private static final int REQUEST_CODE = 0; // 请求码
private BottomSheetDialog mDialog;
private GalleryConfig mGalleryConfig;
public String getTitleText() {
return mTitleText;
}
public void setTitleText(String titleText) {
this.mTitleText = titleText;
mTextView.setText(mTitleText);
}
public String getImageUrl() {
return mImageUrl;
}
public ImagePicker(Context context) {
super(context);
mContext = context;
}
public ImagePicker(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
if (!isInEditMode()) {
LayoutInflater.from(context).inflate(R.layout.image_picker, this, true);
}
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ImagePicker);
mDrawableEx = typedArray.getDrawable(R.styleable.ImagePicker_imageEx);
mResIdEx = typedArray.getString(R.styleable.ImagePicker_imageExResId);
mTitleText = typedArray.getString(R.styleable.ImagePicker_titleText);
mTitleColor = typedArray.getColor(R.styleable.ImagePicker_titleTextColor, Color.BLACK);
typedArray.recycle();
}
public ImagePicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (!isInEditMode()) {
mImageView = (ImageView) findViewById(R.id.ip_image);
mTextView = (TextView) findViewById(R.id.ip_text);
mIvEx = (ImageView) findViewById(R.id.ip_imageEx);
if (!TextUtils.isEmpty(mTitleText)) {
mTextView.setText(mTitleText);
}
if (mDrawableEx != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mIvEx.setBackground(mDrawableEx);
}
}
mImageView.setOnClickListener(this);
mIvEx.setOnClickListener(this);
}
//图库初始化
initGalleryPicker();
mPermissionsChecker = new PermissionsChecker(mContext);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ip_image:
showDialog();
break;
case R.id.ip_imageEx:
lookEx();
break;
case R.id.tv_takePhoto:
takePhoto();
dismissDialog();
break;
case R.id.tv_Gallery:
selectGallery();
dismissDialog();
break;
case R.id.tv_cancel:
dismissDialog();
break;
}
}
private void lookEx() {
Resources res = getResources();
int drawable = res.getIdentifier(mResIdEx, "drawable", mContext.getPackageName());
mContext.startActivity(new Intent(mContext, ImageActivity.class)
.putExtra(Constants.IMAGE, drawable));
}
private void takePhoto() {
GalleryPick.getInstance().setGalleryConfig(mGalleryConfig).openCamera((Activity) mContext);
}
//打开相机
private void dismissDialog() {
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
}
//从图库选择
private void selectGallery() {
if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
PermissionsActivity.startActivityForResult((Activity) mContext, REQUEST_CODE, PERMISSIONS);
}
mGalleryConfig.getBuilder().isOpenCamera(false).build();
GalleryPick.getInstance().setGalleryConfig(mGalleryConfig).open((Activity) mContext);
}
private void showDialog() {
if (mDialog == null) {
mDialog = new BottomSheetDialog(mContext);
View dialogView = LayoutInflater.from(mContext).inflate(R.layout.image_picker_dialog, null);
TextView tvTakePhoto = (TextView) dialogView.findViewById(R.id.tv_takePhoto);
TextView tvGallery = (TextView) dialogView.findViewById(R.id.tv_Gallery);
TextView tvCancel = (TextView) dialogView.findViewById(R.id.tv_cancel);
tvTakePhoto.setOnClickListener(this);
tvGallery.setOnClickListener(this);
tvCancel.setOnClickListener(this);
mDialog.setContentView(dialogView);
}
mDialog.show();
}
private void initGalleryPicker() {
mGalleryConfig = new GalleryConfig.Builder()
.imageLoader(new GlideImageLoader())
.iHandlerCallBack(iHandlerCallBack)
.crop(true)
.build();
}
IHandlerCallBack iHandlerCallBack = new IHandlerCallBack() {
@Override
public void onStart() {
}
@Override
public void onSuccess(List<String> photoList) {
if (photoList.size() > 0) {
String path = photoList.get(0);
//图片展示,当有多个控件时,总是加载到最后一个控件上
Glide.with(mContext)
.load(path)
.centerCrop()
.into(mImageView);
mTextView.setVisibility(View.GONE);
//上传
Bitmap bitmap = ImageUtils.getBitmap(path);
byte[] imgByte = ImageUtils.bitmap2Bytes(bitmap, Bitmap.CompressFormat.JPEG);
String imgString = Constants.BASE64_ENCODE + EncodeUtils.base64Encode2String(imgByte);
RetrofitHelper.getInstance().upload(new RxSubscriber<String>(mContext) {
@Override
public void onNext(String s) {
mImageUrl = s;
}
}, imgString);
}
}
@Override
public void onCancel() {
}
@Override
public void onFinish() {
}
@Override
public void onError() {
}
};
}
三星S7edge,Android 7.0,图片显示为空,也不显示图片文件夹,拍照按钮倒是可以用。
-keep class com.yancy.gallerypick.**{*;}
简单剔除不行。能拉起空相册列表界面,然后崩溃。
求解
FATAL EXCEPTION: main
java.lang.SecurityException: Uid 10158 does not have permission to uri content://com.yancy.gallerypickdemo.fileprovider/external/storage/sdcard0/Vitek/jcoa/pics/20170529152551.jpg
at android.os.Parcel.readException(Parcel.java:1430)
at android.os.Parcel.readException(Parcel.java:1384)
at android.app.ActivityManagerProxy.grantUriPermission(ActivityManagerNative.java:3178)
at android.app.ContextImpl.grantUriPermission(ContextImpl.java:1631)
at android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:453)
at com.yancy.gallerypick.activity.GalleryPickActivity.showCameraAction(GalleryPickActivity.java:343)
at com.yancy.gallerypick.activity.GalleryPickActivity.access$300(GalleryPickActivity.java:46)
at com.yancy.gallerypick.activity.GalleryPickActivity$2.OnClickCamera(GalleryPickActivity.java:150)
at com.yancy.gallerypick.adapter.PhotoAdapter$1.onClick(PhotoAdapter.java:71)
at android.view.View.performClick(View.java:4107)
at android.view.View$PerformClick.run(View.java:17160)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5536)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841)
at dalvik.system.NativeStart.main(Native Method)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.