我在Android应用中实现了设备相机功能。它在我测试过的所有设备上运行良好且良好。现在我收到了使用Pixel XL的用户的崩溃报告。
Pixel XL是否有任何从onActivityResult获取位图的变化?
我的代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == AppConstants.ACTION_REQUEST_CAMERA && resultCode == Activity.RESULT_OK) {
if(data != null) {
if(data.getData()!=null) {
try {
if (bitmap != null) {
bitmap.recycle();
}
InputStream stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
stream.close();
setCircularBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
bitmap = (Bitmap) data.getExtras().get("data");
setCircularBitmap(bitmap);
}
} else {
LogUtils.debug("path",initialURI.getEncodedPath());
bitmap = getBitmapFromUri(initialURI);
setCircularBitmap(bitmap);
Toast.makeText(EditProfileActivity.this, "path " + initialURI.getEncodedPath(), Toast.LENGTH_SHORT).show();
}
isProfileImageUpdated = true;
super.onActivityResult(requestCode, resultCode, data);
} else if (requestCode == AppConstants.ACTION_REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
if(data != null) {
Uri selectedImage = data.getData();
bitmap = getBitmapFromUri(selectedImage);
setCircularBitmap(bitmap);
} else {
LogUtils.debug("path", "Gallery Data null");
}
isProfileImageUpdated = true;
super.onActivityResult(requestCode, resultCode, data);
}
}
第一个条件是设备相机,第二个是Gallery。我也实现了运行时权限。
这一行崩溃了:
bitmap = (Bitmap) data.getExtras().get("data");
我为Pixel XL错过了什么?没有找到任何指向Pixel XL的帖子。
编辑: 崩溃报告:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1025, result=-1, data=Intent { }} to activity {com.paramsolutions.leadshare/com.paramsolutions.leadshare.activity.EditProfileActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.BaseBundle.get(java.lang.String)' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4089)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.BaseBundle.get(java.lang.String)' on a null object reference
at com.paramsolutions.leadshare.activity.EditProfileActivity.onActivityResult(EditProfileActivity.java:323)
at android.app.Activity.dispatchActivityResult(Activity.java:6932)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
行号指向上述行,而我的Moto G4 Plus也是7.0。我没有这个问题。 Pixel XL有什么不同吗?
答案 0 :(得分:0)
该应用是否会崩溃所有Android 7.0设备。
如果您的targetSdkVersion为24或更高,我们必须使用FileProvider类来访问特定文件或文件夹,以使其可供其他应用访问。
使用content:// uri:
替换file:// uri的步骤将此添加到您的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>
然后在res文件夹下的xml文件夹中创建一个provider_paths.xml文件。如果文件夹不存在,则可能需要创建文件夹。该文件的内容如下所示。它描述了我们希望在名称为external_files的根文件夹(path =“。”)中共享对外部存储的访问。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
最后一步是在
中更改下面的代码行Uri photoURI = Uri.fromFile(createImageFile());
到
Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());