从库中加载图像时出现罕见的安全异常
Rare Security Exception when loading an image from the gallery
我一直在为我的应用解决 Google Play 控制台中列出的崩溃问题。我似乎无法重现的一次崩溃:
java.lang.RuntimeException:
at android.app.ActivityThread.deliverResults (ActivityThread.java:3778)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:3821)
at android.app.ActivityThread.access00 (ActivityThread.java:168)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1428)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:150)
at android.app.ActivityThread.main (ActivityThread.java:5659)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:822)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:712)
Caused by: java.lang.SecurityException:
at android.os.Parcel.readException (Parcel.java:1602)
at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query (ContentProviderNative.java:421)
at android.content.ContentResolver.query (ContentResolver.java:513)
at android.content.ContentResolver.query (ContentResolver.java:438)
at za.co.overtake.onlinetrucks.utils.Utils.getBitmapFromUri (Utils.java:381)
at za.co.overtake.onlinetrucks.fragments.DamagePanelDetailsDialogFragment.onActivityResult (DamagePanelDetailsDialogFragment.java:513)
at android.support.v4.app.FragmentActivity.onActivityResult (FragmentActivity.java:164)
at android.app.Activity.dispatchActivityResult (Activity.java:6602)
at android.app.ActivityThread.deliverResults (ActivityThread.java:3774)
据报道,崩溃发生在华为 P8 Lite 上。我已经在各种设备(包括华为 P8)上进行了测试,但无法重现该问题!这些是我的清单文件中的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在这里我请求用户权限:
public static void dispatchLoadGalleryEvent(Context context, Fragment frag) {
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
PermissionUtil.requestWritePermission(context, frag, ACCESS_GALLERY_PERMISSION_CODE);
return;
}
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
frag.startActivityForResult(i, ACCESS_GALLERY_REQUEST_CODE);
}
然后在这里我使用从意图返回的 URI 加载图像:
public static Bitmap getBitmapFromUri(Context context, Uri selectedImage) {
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(selectedImage, filePathColumn,
null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
return (Utils.getBitmapFromFileWithCorrectOrientation(picturePath, 4));
}
报告崩溃发生在 context.getContentResolver().query() 行。我觉得我在某个地方做了一些愚蠢的事情,并且非常困惑我无法重现这个问题。
安全异常
Thrown by the security manager to indicate a security violation.
Throwable.getMessage()
将提供有关安全性的具体信息。没有消息真的很难确定问题。
Caused by: java.lang.SecurityException: <We got getMessage() data here but it is blank>
logcat 来自 Google PlayStore。它有很多关于用户操作的可能性。如:-
1. 用户拒绝部分权限。
2. 用户想要 运行 您的应用程序而无需授权。
3. 我认为您必须处理每个权限验证。如果用户想要拒绝权限,那么您必须停止用户查看该页面和功能,或者只是处理它,这样它就不会在用户拒绝任何权限时崩溃。
等等。
只需尝试 运行 您的应用程序,同时拒绝所有权限,并尝试查看它 运行ning 与否,如果应用程序在任何地方崩溃,请找到合适的解决方案。
注意:-一切都是关于从头到尾测试应用程序。
我一直在为我的应用解决 Google Play 控制台中列出的崩溃问题。我似乎无法重现的一次崩溃:
java.lang.RuntimeException:
at android.app.ActivityThread.deliverResults (ActivityThread.java:3778)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:3821)
at android.app.ActivityThread.access00 (ActivityThread.java:168)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1428)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:150)
at android.app.ActivityThread.main (ActivityThread.java:5659)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:822)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:712)
Caused by: java.lang.SecurityException:
at android.os.Parcel.readException (Parcel.java:1602)
at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query (ContentProviderNative.java:421)
at android.content.ContentResolver.query (ContentResolver.java:513)
at android.content.ContentResolver.query (ContentResolver.java:438)
at za.co.overtake.onlinetrucks.utils.Utils.getBitmapFromUri (Utils.java:381)
at za.co.overtake.onlinetrucks.fragments.DamagePanelDetailsDialogFragment.onActivityResult (DamagePanelDetailsDialogFragment.java:513)
at android.support.v4.app.FragmentActivity.onActivityResult (FragmentActivity.java:164)
at android.app.Activity.dispatchActivityResult (Activity.java:6602)
at android.app.ActivityThread.deliverResults (ActivityThread.java:3774)
据报道,崩溃发生在华为 P8 Lite 上。我已经在各种设备(包括华为 P8)上进行了测试,但无法重现该问题!这些是我的清单文件中的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在这里我请求用户权限:
public static void dispatchLoadGalleryEvent(Context context, Fragment frag) {
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
PermissionUtil.requestWritePermission(context, frag, ACCESS_GALLERY_PERMISSION_CODE);
return;
}
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
frag.startActivityForResult(i, ACCESS_GALLERY_REQUEST_CODE);
}
然后在这里我使用从意图返回的 URI 加载图像:
public static Bitmap getBitmapFromUri(Context context, Uri selectedImage) {
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(selectedImage, filePathColumn,
null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
return (Utils.getBitmapFromFileWithCorrectOrientation(picturePath, 4));
}
报告崩溃发生在 context.getContentResolver().query() 行。我觉得我在某个地方做了一些愚蠢的事情,并且非常困惑我无法重现这个问题。
安全异常
Thrown by the security manager to indicate a security violation.
Throwable.getMessage()
将提供有关安全性的具体信息。没有消息真的很难确定问题。
Caused by: java.lang.SecurityException: <We got getMessage() data here but it is blank>
logcat 来自 Google PlayStore。它有很多关于用户操作的可能性。如:-
1. 用户拒绝部分权限。
2. 用户想要 运行 您的应用程序而无需授权。
3. 我认为您必须处理每个权限验证。如果用户想要拒绝权限,那么您必须停止用户查看该页面和功能,或者只是处理它,这样它就不会在用户拒绝任何权限时崩溃。
等等。
只需尝试 运行 您的应用程序,同时拒绝所有权限,并尝试查看它 运行ning 与否,如果应用程序在任何地方崩溃,请找到合适的解决方案。
注意:-一切都是关于从头到尾测试应用程序。