Android Java 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

这是我在理解这个问题时遇到的麻烦。让我首先说,我在清单文件中有正确的权限设置。我还验证用户是否具有访问外部存储中文件的权限。这就是疯狂的问题。我正在使用UCrop在我的应用程序中裁剪图像。由于某些原因,我必须先将文件复制到内部存储器,然后才能将其与UCrop一起使用。这就是我的意思

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”

到我的清单下的应用程序部分

看起来,随着存储的发展,情况发生了变化。有关详细信息,请阅读: