当我选择任何第三方相机应用程序

时间:2016-06-24 09:48:35

标签: android android-intent nullpointerexception camera android-camera-intent

我的问题是,每次我选择第三方相机应用程序,例如 Beauty Plus相机我每次都有空指针异常,我的代码完全适用于默认相机应用程序,它甚至适用于Google&# 39;用于摩托车系列手机的新相机。

第一次选择图库或相机选项的对话框在这里:

private void OpenDialogForImage() {

    final CharSequence[] items = {
            "Gallary", "Camera", "Cancel"
    };

    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            // Do something with the selection
            switch (item) {
                case 0:
                    Intent intent1 = new Intent(
                            Intent.ACTION_PICK,
                            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent1.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(intent1, "Select File"),
                            SELECT_FILE);
                    break;
                case 1:

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent, REQUEST_CAMERA);

                    break;
                case 2:

                    break;
            }
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

这是OnActivityResult()方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == Sponser_key && resultCode == Activity.RESULT_OK) {
        String sSponsors = data.getStringExtra("Sponsors");
        if (sSponsors != null)
            sponsorsResp = new Gson().fromJson(sSponsors, GetSponsorsResp.class);
    } else if (requestCode == REQUEST_CAMERA) {


        if (resultCode == activity.RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");

            ivProfile.setImageBitmap(photo);


            // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
            Uri tempUri = Other.getImageUri(activity, photo);


            file = new File(Other.getRealPathFromURI(activity, tempUri));
        } else {
            /**
             * not select any image
             */
        }
    } else if (requestCode == SELECT_FILE) {

        if (resultCode == activity.RESULT_OK) {
            Uri selectedImageUri = data.getData();
            ivProfile.setImageURI(selectedImageUri);
            file = new File(Other.getPath(activity, selectedImageUri));

        }

    }
}

以上代码注释了我之前提到过的一些第三方应用程序。我在这行中得到NullPointerException:  位图照片=(位图)data.getExtras()。get("数据");

3 个答案:

答案 0 :(得分:2)

如果您想利用第三方应用,则不会有完美的解决方案,因为它们不需要遵循与标准Android相机应用相同的合同。但是你可能会比现在获得更好的结果。

标准相机应用程序符合此合同:

  1. 它会在intent.getExtras.get("data")
  2. 中返回缩略图
  3. 如果您提供Uri intent.putExtra(MediaStore.EXTRA_OUTPUT, uri),则会将完整尺寸的图片保存在此位置。
  4. (有关重要​​细节,请参阅training article。)

    虽然您尝试的特定第三方相机应用程序不符合合同的第1部分,但您可能在第2部分中获得更好的运气。

    考虑到全尺寸图像,创建您显然需要的缩略图并不太难,例如在Stack Overflow上使用答案。

答案 1 :(得分:1)

查看此文件: https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java

尝试使用:

File mPhotoFile = FileUtils.getFile(context,data.getData());

返回文件。

答案 2 :(得分:1)

这是使用外部应用程序为您处理功能的问题。理论上,接受Intent操作的应用程序应该正确处理Intent并返回您要求的数据,但实际上,您可以采取的措施很少来强制执行此行为...例如,任何应用程序都可以说它处理"图像捕获,"但如果您将Intent传递给程序不佳或恶意的应用程序,则无法阻止该应用程序执行与您预期完全不同的操作,或者根本没有任何操作。如果您选择让您的应用程序放弃对另一个应用程序的控制以实现某些功能,您将承担选择任何应用程序无法实现该功能的风险。

始终确保非常少的选项,您的应用会以您希望的方式拍摄照片:

  • 为您的相机Intent创建一个选择器,并将结果限制为仅经过测试且知道按预期工作的应用。如果未安装特定应用程序,请禁用拍照功能。
  • 自己实施图像捕捉。