gpt4 book ai didi

android - 在 Android 9 中访问图像时出现 SecurityException

转载 作者:行者123 更新时间:2023-11-30 04:55:33 28 4
gpt4 key购买 nike

这是我在这里的第一篇文章,所以如果我的礼仪不正确,请告诉我,我会更新。

我们制作了一个用于跟踪与宠物相关的数据的应用程序。设置宠物时,您可以拍一张新照片,也可以使用图库中的一张。在我的三星 s9 (Android 9 - API 28) 上完美运行。我们在 API 29 上遇到了一个我似乎无法弄清楚的 SecurityException。这是崩溃报告:

    java.lang.RuntimeException: 
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3163)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3306)
at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1994)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:216)
at android.app.ActivityThread.main (ActivityThread.java:7263)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:975)
Caused by: java.lang.SecurityException:
at android.os.Parcel.createException (Parcel.java:1966)
at android.os.Parcel.readException (Parcel.java:1934)
at android.os.Parcel.readException (Parcel.java:1884)
at android.app.IActivityManager$Stub$Proxy.getContentProvider (IActivityManager.java:4029)
at android.app.ActivityThread.acquireProvider (ActivityThread.java:6506)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider (ContextImpl.java:2825)
at android.content.ContentResolver.acquireUnstableProvider (ContentResolver.java:1835)
at android.content.ContentResolver.openTypedAssetFileDescriptor (ContentResolver.java:1449)
at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1302)
at android.content.ContentResolver.openInputStream (ContentResolver.java:1022)
at android.provider.MediaStore$Images$Media.getBitmap (MediaStore.java:920)
at com.reptibox.reptileapp.EditReptileData.getReptileImage (EditReptileData.java:228)
at com.reptibox.reptileapp.EditReptileData.getReptileInfo (EditReptileData.java:298)
at com.reptibox.reptileapp.EditReptileData.onCreate (EditReptileData.java:197)
at android.app.Activity.performCreate (Activity.java:7353)
at android.app.Activity.performCreate (Activity.java:7344)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1275)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3143)
Caused by: android.os.RemoteException:
at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15890)
at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15799)
at com.android.server.am.ActivityManagerService.getContentProvider (ActivityManagerService.java:16364)
at android.app.IActivityManager$Stub.onTransact$getContentProvider$ (IActivityManager.java:11085)
at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:295)

这是报告指向的方法:

public Bitmap getReptileImage(){
Cursor cursor = mDB.rawQuery("SELECT * FROM " + ReptileContract.ReptileImageEntry.TABLE_NAME +
" WHERE " + ReptileContract.ReptileImageEntry._ID + "='" + mReptileImageId +
"' ORDER BY " + ReptileContract.ReptileImageEntry._ID + " DESC;", null);

cursor.moveToFirst();

if (cursor.getCount() > 0) {
try {
Uri mImageURI = Uri.parse(cursor.getString(cursor.getColumnIndex(ReptileContract.ReptileImageEntry.COLUMN_REPTILE_URI)));
try{
if (android.os.Build.VERSION.SDK_INT >= 29){
// To handle deprecation use
return ImageDecoder.decodeBitmap(ImageDecoder.createSource(getContentResolver(),mImageURI));
} else{
// Use older version
//SECURITY EXCEPTION HERE
return android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), mImageURI);
}
// }
}
catch(IOException e){
Log.e("IMAGE LOADING", "IOException Error Caught");
e.printStackTrace();
cursor.close();
return null;
}
}
catch (NullPointerException e){
Log.e("IMAGE LOADING", "Normal for first loading, since nothing has URI's");
e.printStackTrace();
cursor.close();
return null;
}
}
else {
cursor.close();
return null;
}
}

如果您需要更多,请告诉我。我正在寻找解决此崩溃的方法,任何能为我指明正确方向的东西都会很棒!

最佳答案

您尝试访问的 URI 类型是一个奇怪的问题。您将获得一个 content 类型的 Uri,它有一些限制。

您通常可以毫无问题地存储和访问 file 类型的 Uri。但是,content Uri 的访问时间有限。

这里您的选择非常有限,但这就是我解决它的方法。您可以将用户选择的文件复制到 directory您的应用程序具有完全访问权限(例如 getFilesDir()),存储复制文件的路径,并让您的应用程序访问副本而不是原始文件。

Check out this answer for some more detail.

关于android - 在 Android 9 中访问图像时出现 SecurityException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59259260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com