如何在Pixel XL中的OnActivityResult中获取图像位图?

时间:2017-04-11 11:28:53

标签: android bitmap android-camera

我在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有什么不同吗?

1 个答案:

答案 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());
相关问题