【问题标题】:Null pointer exception in camera intent when i choose any third party camera Application当我选择任何第三方相机应用程序时,相机意图中的空指针异常
【发布时间】:2016-06-24 09:48:35
【问题描述】:

我的问题是,每次我选择第三方相机应用程序时,例如 Beauty Plus Camera 我每次都会遇到空指针异常,我的代码完全适用于默认相机应用程序,它甚至适用于 Google 的新相机应用程序专为 moto 系列手机打造的相机。

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

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: 位图照片 = (Bitmap) data.getExtras().get("data");

【问题讨论】:

  • 好的@Saurabh我检查了那个答案,但是当我没有使用那个答案中提到的后退按钮时,我也得到了空指针。我只需单击相机按钮即可捕获图像,然后我的应用程序强制停止。
  • 避免依赖第三方应用...可能有问题...而且您无法自己处理...
  • 好的!所以我必须强制用户使用默认的相机应用程序,这是唯一的方法。 @Saurabh
  • 正如你所说,你在使用美颜相机应用程序...可能有问题...尝试使用其他第三方相机应用程序...并调试您的代码以获得更好的解释

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


【解决方案1】:

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

标准相机应用履行此合同:

  1. 它返回intent.getExtras.get("data") 中的缩略图
  2. 如果您提供Uriintent.putExtra(MediaStore.EXTRA_OUTPUT, uri),它会将全尺寸图像保存在此位置。

(有关重要​​详情,请参阅training article。)

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

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

【讨论】:

    【解决方案2】:

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

    试试这个:

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

    返回文件。

    【讨论】:

    • 这是我得到空指针的地方,因为使用第三方相机@SANAT 时数据总是返回空
    【解决方案3】:

    这是使用外部应用为您处理功能的问题。理论上,接受Intent 操作的应用程序应该正确处理Intent 并返回您要求的数据,但实际上您几乎无法强制执行此行为......例如,任何应用程序都可以说它处理“图像捕获”,但如果您将 Intent 传递给编程不当或恶意的应用程序,则没有什么可以阻止该应用程序执行与您的预期完全不同的事情,或者根本不做任何事情。如果您选择让您的应用将控制权交给另一个应用来实现某些功能,那么您将面临选择的任何应用都无法实现该功能的风险。

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多