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

Posted

技术标签:

【中文标题】如何在 Pixel XL 的 OnActivityResult 中获取图像位图?【英文标题】:How to get image bitmap in OnActivityResult in Pixel XL? 【发布时间】:2017-09-06 18:20:11 【问题描述】:

我已经在我的 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);
    

第一个条件是设备相机,第二个条件是图库。而且我也实现了运行时权限。

在这一行发生了崩溃:

bitmap = (Bitmap) data.getExtras().get("data");

Pixel XL 有什么遗漏的吗?没有找到任何指向 Pixel XL 的帖子。

编辑: 崩溃报告:

java.lang.RuntimeException: Failure delivering result ResultInfowho=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 有什么不同吗?

【问题讨论】:

你遇到的崩溃是什么? @MohammedAtif 编辑了问题。 【参考方案1】:

应用程序是否会在所有 Android 7.0 设备上崩溃。

如果您的 targetSdkVersion 为 24 或更高,我们必须使用 FileProvider 类来授予对特定文件或文件夹的访问权限,以便其他应用程序可以访问它们。

将 file:// uri 替换为 content:// 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 文件。如果文件夹不存在,可能需要创建它。该文件的内容如下所示。它描述了我们希望共享对位于根文件夹 (path=".") 的外部存储的访问权限,名称为 external_files。

<?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());

【讨论】:

我有 Moto G4 Plus,它也是 7.0。我没有那个问题。但会尝试你的代码,然后回复给你。无论如何谢谢.. 我已经在清单和 XML 中有你提到的代码。但是正如你提到的,我在我的代码中找不到这一行。 Uri photoURI = Uri.fromFile(createImageFile());你从哪里弄来的? @Ari 你的应用允许选择多张图片吗?? 不,是为了头像。仅单张图片 @Ari 那么请检查当您遇到此崩溃时返回给您的活动结果数据是什么,活动结果中的 Intent 实例

以上是关于如何在 Pixel XL 的 OnActivityResult 中获取图像位图?的主要内容,如果未能解决你的问题,请参考以下文章

Android应用程序崩溃在Android 8.0(谷歌Pixel XL)

Pixel XL 刷机及Root过程

为啥除了 Pixel XL 设备在 android studio 模拟器中所有 ADV 设备都不能工作?

Eclipse logcat 没有来自 Pixel XL 的日志,没有调试,电话无法识别

Android:Camera2 API 仅在 Google Pixel 2 和 2 XL 设备上崩溃

谷歌Pixel 2搭载安卓8.1系统 10月4日首发