当我选择任何第三方相机应用程序时相机意图中的空指针异常
Null pointer exception in camera intent when i choose any third party camera Application
我的问题是,每次我选择第三方相机应用程序时,例如 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:
位图照片=(位图)data.getExtras().get("data");
尝试使用这个:
File mPhotoFile = FileUtils.getFile(context,data.getData());
哪个 return 文件。
这是使用外部应用程序为您处理功能的问题。理论上,接受 Intent
操作的应用程序应该正确处理 Intent
和 return 您要求的数据,但实际上您几乎无能为力来强制执行此行为。 .例如,任何应用程序都可以说它处理 "image capture,",但如果您要将 Intent
传递给编程不当或恶意的应用程序,则没有什么可以阻止该应用程序执行与您预期完全不同的事情,或者什么都没有。如果您选择让您的应用放弃对另一个应用的控制以实现某些功能,您将承担选择的任何应用都无法实现该功能的风险。
要始终确保您的应用程序会按您希望的方式拍照的选项确实很少:
- 为您的相机创建一个选择器
Intent
并将结果限制为仅您已经测试过并且知道可以按预期工作的应用程序。如果没有安装特定的应用程序,请禁用拍照功能。
- 自己实现图像捕获。
如果您想利用第三方应用程序,不会有完美的解决方案,因为它们不需要遵循与标准 Android 相机应用程序相同的合同。但是你可能会得到比现在更好的结果。
标准相机应用程序履行此合同:
- returns 缩略图
intent.getExtras.get("data")
- 如果您提供
Uri
和 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
,它将在此位置保存全尺寸图像。
(有关重要详细信息,请参阅 training article。)
虽然您尝试的特定第三方相机应用程序不符合合同的第 1 部分,但您可能更幸运地完成第 2 部分。
鉴于全尺寸图像,创建您显然需要的缩略图并不难,例如使用 Stack Overflow 上的答案。
我的问题是,每次我选择第三方相机应用程序时,例如 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: 位图照片=(位图)data.getExtras().get("data");
尝试使用这个:
File mPhotoFile = FileUtils.getFile(context,data.getData());
哪个 return 文件。
这是使用外部应用程序为您处理功能的问题。理论上,接受 Intent
操作的应用程序应该正确处理 Intent
和 return 您要求的数据,但实际上您几乎无能为力来强制执行此行为。 .例如,任何应用程序都可以说它处理 "image capture,",但如果您要将 Intent
传递给编程不当或恶意的应用程序,则没有什么可以阻止该应用程序执行与您预期完全不同的事情,或者什么都没有。如果您选择让您的应用放弃对另一个应用的控制以实现某些功能,您将承担选择的任何应用都无法实现该功能的风险。
要始终确保您的应用程序会按您希望的方式拍照的选项确实很少:
- 为您的相机创建一个选择器
Intent
并将结果限制为仅您已经测试过并且知道可以按预期工作的应用程序。如果没有安装特定的应用程序,请禁用拍照功能。 - 自己实现图像捕获。
如果您想利用第三方应用程序,不会有完美的解决方案,因为它们不需要遵循与标准 Android 相机应用程序相同的合同。但是你可能会得到比现在更好的结果。
标准相机应用程序履行此合同:
- returns 缩略图
intent.getExtras.get("data")
- 如果您提供
Uri
和intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
,它将在此位置保存全尺寸图像。
(有关重要详细信息,请参阅 training article。)
虽然您尝试的特定第三方相机应用程序不符合合同的第 1 部分,但您可能更幸运地完成第 2 部分。
鉴于全尺寸图像,创建您显然需要的缩略图并不难,例如使用 Stack Overflow 上的答案。