如何在 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 设备在 android studio 模拟器中所有 ADV 设备都不能工作?
Eclipse logcat 没有来自 Pixel XL 的日志,没有调试,电话无法识别