java - 访问 Android 相机时 Intent 出现 NullPointerException

标签 java android firebase firebaseui

我尝试按照此处所述调用相机应用程序两次:https://developer.android.com/training/camera/photobasics 现在,当我在没有创建临时文件的情况下使用它时,它起作用了,我能够调用相机两次,但在添加临时文件后,我只能在崩溃之前获取一个文件。这非常令人沮丧,因为我可以看到它在崩溃之前返回了完整尺寸的图像。

我尝试在 get 之前执行第二次 .putExtras() 但不起作用。我也尝试过断言不为空,结果相同。

private void takePictureAndUpload() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File

            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.example.android.provider",
                        photoFile);
                startActivityForResult(takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                        , REQUEST_IMAGE_CAPTURE);
            }
        }


    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if ((requestCode == REQUEST_IMAGE_CAPTURE) && (resultCode == Activity.RESULT_OK)){
            count++;
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            assert imageBitmap != null;
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            final byte[] imageData = stream.toByteArray();

            setuId(user);
            final String path = "posts/" + UUID.randomUUID() + ".jpg";

            FirebaseStorage storage = FirebaseStorage.getInstance();
            final StorageReference storageRef = storage.getReference();
            final StorageReference imageRef = storageRef.child(path);


            UploadTask uploadTask = imageRef.putBytes(imageData);
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    String ex = e.getLocalizedMessage();
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    imageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
                    {
                        @Override
                        public void onSuccess(Uri downloadUrl)
                        {
                            final String url = downloadUrl.toString();//do something with downloadurl
                            data.putExtra(MediaStore.EXTRA_OUTPUT, url);
                            addPhotoUrlToDatabase(post.getImageUrl_1(), post.getImageUrl_2(), path);

                        }
                    });
                }
            });
        }
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

这应该打开相机拍照,然后在接受第一张照片后应该重新打开相机拍摄第二张照片。然而到目前为止,它所做的只是打开相机,拍照,然后当我点击“接受”时,它会因 nullPointerException 崩溃。

日志猫:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android, PID: 21689
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.android/com.example.android.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4491)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4534)
        at android.app.ActivityThread.-wrap20(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1752)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
        at com.example.android.MainActivity.onActivityResult(MainActivity.java:257)
        at android.app.Activity.dispatchActivityResult(Activity.java:7547)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4487)

编辑

这是我遵循的指南: https://developer.android.com/training/camera/photobasics.html#TaskPath

最佳答案

使您的 Activity 结果像这样,因为使用相同的命名参数会令人困惑。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
          }

您的 bundle 似乎为空。

关于java - 访问 Android 相机时 Intent 出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56605682/

相关文章:

android - 更新本地 Android 数据库

android - apache cordova android native 应用程序上的 html5 音频

java.lang.ClassCastException : org. json.simple.JSONArray 无法转换为 org.json.JSONArray

Java 数组索引超出范围异常 : 20 multidimensional array

java - 如何真正洗牌

java - 支持谷歌地图 API(v1 和 v2)的最佳方式是什么?

android - 向 ios 和 android 设备发送 Firebase 云消息

ios - Swift & Firebase - 无法转换类型为 '__NSDictionaryM' 的值

android - 是否可以重置 Google Analytics for Firebase?

java - 无法使用 RecyclerAdapter 将对象转换为字符串值