【问题标题】:Android get file path of image with in Fragment [duplicate]Android在片段中获取图像的文件路径[重复]
【发布时间】:2018-02-23 06:31:52
【问题描述】:

我有一个应用程序,我需要拍照,然后将其上传到 Firebase。我基本上需要拍摄照片的 Uri 路径。

我阅读了Get file path of image on Android,但我遇到了 NullPointerException 的问题。

我的问题与上述问题之间的主要区别在于我是在片段中进行的。

这是我的代码:

mTakePhotoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }
    });

我得到与 Uri imgUri 一致的 NullPointerException。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            mImgView.setImageBitmap(photo);
            Uri imgUri = getImageUri(getActivity().getApplicationContext(), photo);
            mManager.setPhotoUri(imgUri);
        }
}

这是我用来获取 Uri 的方法。

private Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
        return Uri.parse(path);
    }

确切的错误信息是:

java.lang.RuntimeException: 传递结果失败 ResultInfo{who=android:fragment:1, request=22222, result=-1, data=Intent { act=inline-data (has extras) }} 到活动 {。主要活动}: java.lang.NullPointerException: uriString

我将不胜感激。

整个错误日志:

09-14 12:06:18.448 16497-16497/com.example.radzik.recipes E/AndroidRuntime: 致命异常: main 进程:com.example.radzik.recipes,PID:16497 java.lang.RuntimeException:将结果 ResultInfo{who=android:fragment:1, request=22222, result=-1, data=Intent { act=inline-data (has extras) }} 传递给活动 {com.example. radzik.recipes/com.example.radzik.recipes.activity.MainActivity}:java.lang.NullPointerException:uriString 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3699) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.NullPointerException:uriString 在 android.net.Uri$StringUri.(Uri.java:475) 在 android.net.Uri$StringUri.(Uri.java) 在 android.net.Uri.parse(Uri.java:437) 在 com.example.radzik.recipes.fragment.ChoosePhotoFragment.getImageUri(ChoosePhotoFragment.java:144) 在 com.example.radzik.recipes.fragment.ChoosePhotoFragment.onActivityResult(ChoosePhotoFragment.java:135) 在 android.app.Activity.dispatchActivityResult(Activity.java:6452) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 你能贴出包含堆栈帧的整个错误日志吗?
  • 我已经用完整的错误更新了我的问题
  • 看起来insertImage 调用正在返回null,因此pathnull。见stackoverflow.com/questions/23059580/…
  • 我去看看。非常感谢!

标签: java android android-fragments nullpointerexception


【解决方案1】:

您的问题在于getActivity(),因为您正在了解您正在进行的当前活动的意图,该活动将失败。 因此,如果您将代码移至OnActivityResult,这将使其正常工作。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //first call super
    super.onActivityResult(requestCode, resultCode, data);

    //rest of your code
}

别忘了添加

<uses-permission android:name="android.permission.CAMERA" />

和/或不依赖于您的应用

<uses-feature android:name="android.hardware.camera" />

【讨论】:

  • 问题有误,在onActivityResult里面。感谢您指出这一点!
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2015-10-21
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2011-10-19
相关资源
最近更新 更多