当我选择任何第三方摄像机应用程序时,相机意图中的空指针异常



我的问题是,每次我选择第三方摄像机应用程序时,例如 Beauty Plus Camera 我每次都会获得Null Pointer Exception相机应用程序甚至可以与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 photo =(bitmap)data.getExtras()。get(" data");

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

标准摄像机应用符合此合同:

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

(有关重要详细信息,请参见培训文章。)

尽管您尝试过的特定的第三方摄像机应用程序无法满足合同的第1部分,但您可能会在第2部分中运气更好。

给定全尺寸图像,创建显然需要的缩略图并不难,例如在此处使用堆栈溢出的答案。

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

尝试使用以下方式:

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

哪个返回文件。

这是使用外部应用为您处理功能的问题。从理论上讲,接受Intent操作的应用程序应正确处理Intent并返回您要的数据,但实际上,您几乎无法执行此行为...捕获,"但是,如果您要将Intent传递给编程较差或恶意应用程序,那么没有什么可以阻止该应用程序做与您想要的完全不同的事情,或者根本没有什么。如果您选择让您的应用程序放弃控制另一个应用程序以实现某些功能,那么您会承担任何选择无法满足该功能的风险。

实际上很少有的选项始终确保您的应用程序会按照您想要的方式拍摄图片:

  • 为您的相机Intent创建一个选择器,并将结果限制在您已经测试并了解预期工作的应用程序中。如果未安装特定的应用程序,请禁用图片的功能。
  • 实施图像捕获自己。

最新更新