Android Java UCrop权限问题
这是我在理解这个问题时遇到的麻烦。让我首先说,我在清单文件中有正确的权限设置。我还验证用户是否具有访问外部存储中文件的权限。这就是疯狂的问题。我正在使用UCrop在我的应用程序中裁剪图像。由于某些原因,我必须先将文件复制到内部存储器,然后才能将其与UCrop一起使用。这就是我的意思Android Java UCrop权限问题,java,android,permissions,ucrop,Java,Android,Permissions,Ucrop,这是我在理解这个问题时遇到的麻烦。让我首先说,我在清单文件中有正确的权限设置。我还验证用户是否具有访问外部存储中文件的权限。这就是疯狂的问题。我正在使用UCrop在我的应用程序中裁剪图像。由于某些原因,我必须先将文件复制到内部存储器,然后才能将其与UCrop一起使用。这就是我的意思 private void LoadImage(意图数据){ 试一试{ Uri imageUri=data.getData(); Uri tempUri=IO.CopyTemporaryBitmap(getApplic
private void LoadImage(意图数据){
试一试{
Uri imageUri=data.getData();
Uri tempUri=IO.CopyTemporaryBitmap(getApplicationContext(),imageUri);
StartCrop(tempUri,getFilesDir()+“/temprime.png”);
}
捕获(例外e){
e、 printStackTrace();
Toast.makeText(此“无法加载图片:”,Toast.LENGTH_LONG.show();
}
}
IO.CopyTemporary位图
公共静态Uri CopyTemporaryBitmap(上下文上下文,Uri src){
位图bmp;
试一试{
InputStream imageStream=context.getContentResolver().openInputStream(src);
bmp=位图工厂.decodeStream(imageStream);
}
捕获(例外e){
e、 printStackTrace();
返回null;
}
如果(bmp==null)返回null;
File tempPath=新文件(GetTempFolder());
File File=新文件(GetTempFolder()+“tempImage.png”);
试一试{
布尔b=真;
如果(!tempPath.exists())b=tempPath.mkdirs();
如果(!file.exists()&&b)b=file.createNewFile();
如果(b){
FileOutputStream out=新的FileOutputStream(文件);
bmp.compress(Bitmap.CompressFormat.PNG,100,out);
}
返回Uri.fromFile(文件);
}
捕获(例外e){
e、 printStackTrace();
}
返回null;
}
如果我这样做,它会起作用。我有读/写权限,所以我可以将图像复制到内部,然后进行裁剪,但如果我这样做的话
private void LoadImage(意图数据){
试一试{
Uri imageUri=data.getData();
StartCrop(imageUri,getFilesDir()+“/temprime.png”);
}
捕获(例外e){
e、 printStackTrace();
Toast.makeText(此“无法加载图片:”,Toast.LENGTH_LONG.show();
}
}
然后我得到
E/TransformImageView: onFailure: setImageUri
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:315)
at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:220)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1498)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1338)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1286)
at com.yalantis.ucrop.task.BitmapLoadTask.doInBackground(BitmapLoadTask.java:97)
at com.yalantis.ucrop.task.BitmapLoadTask.doInBackground(BitmapLoadTask.java:41)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
经过大量调试,我发现罪魁祸首是TransformImageView.java类中的setImageUri方法,它是UCrop的一部分,我没有编写
/**
*此方法将Uri作为参数,然后调用方法将其解码为具有指定大小的位图。
*
*@param imageUri-图像Uri
*@throws Exception-如果在解码Uri或OOM时遇到问题,则可以引发异常。
*/
public void setImageUri(@NonNull-Uri-imageUri,@Nullable-Uri-outputUri)引发异常{
int maxBitmapSize=getMaxBitmapSize();
BitmapLoadUtils.decodeBitmapInBackground(getContext()、imageUri、outputUri、maxBitmapSize、maxBitmapSize、,
新的BitmapLoadCallback(){
@凌驾
已加载BitMapLoaded(@NonNull位图位图、@NonNull ExifInfo ExifInfo、@NonNull字符串imageInputPath、@Nullable字符串imageOutputPath)上的public void{
mImageInputPath=图像输入路径;
mImageOutputPath=图像输出路径;
mExifInfo=exifInfo;
mBitmapDecoded=真;
setImageBitmap(位图);
}
@凌驾
public void onFailure(@NonNull异常bitmapWorkerException){
Log.e(标记“onFailure:setImageUri”,bitmapWorkerException);
if(mtTransformImageListener!=null){
mtTransformImageListener.onLoadFailure(bitmapWorkerException);
}
}
});
}
无论出于何种原因,“BitmapLoadUtils.decodeBitmapInBackground…”总是会触发“onFailure”选项,并显示“权限被拒绝”。有什么线索吗?好吧,这似乎是一个API级别的问题,针对API级别29,因为所谓的“范围映射机制”存在问题,特别是在Android 10这样的新版本中
您首先提供的解决方案是目前最好的 以下是我发现的解决问题的方法: 我补充说 android:requestLegacyExternalStorage=“true” 到我的清单下的应用程序部分 看起来,随着存储的发展,情况发生了变化。有关详细信息,请阅读: