Android 相机捕捉 fileUri.getPath 有时为 null
Android Camera Capture fileUri.getPath sometimes null
我知道这是一个经常讨论的话题,但我找不到任何解决方案:-(
在我的 "capture Image"-Button 上,我执行以下操作:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image capture Intent
startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
我在 class 定义(扩展 activity)之后将私有 int 变量设置为:
public static final int MEDIA_TYPE_IMAGE = 1;
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
下一步是我的 onActivityResult 方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if the result is capturing Image
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
launchUploadActivity(true);
....
这是我的 launchUploadActivity
private void launchUploadActivity(boolean isImage){
System.out.println("Bild: launchUploadActivity");
String filePath = fileUri.getPath();
if (filePath != null) {
previewMedia(filePath);
}
}
问题来了!有时带有 "fileUri.getPath();" 的行会抛出空指针异常。我不知道为什么它有时会起作用。特别是当我第一次启动应用程序时,它似乎崩溃了。
谢谢你帮我!
您是否使用 onSaveInstanceState
和 oncreate
保存并恢复了字段 fileUri
?
我认为错误发生在重新创建 activity 时,因为您在拍照时切换了方向。
编辑:
例如
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("file_uri", fileUri.toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// your code
if(savedInstanceState!=null) {
fileUri = Uri.parse(savedInstanceState.getString("file_uri"));
}
}
感谢@Derek Fung
正是我要找的! :-)
对于所有其他人:这两种方法是强制性的!
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save file url in bundle as it will be null on screen orientation
// changes
outState.putParcelable("file_uri", fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the file url
fileUri = savedInstanceState.getParcelable("file_uri");
}
我知道这是一个经常讨论的话题,但我找不到任何解决方案:-(
在我的 "capture Image"-Button 上,我执行以下操作:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image capture Intent
startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
我在 class 定义(扩展 activity)之后将私有 int 变量设置为:
public static final int MEDIA_TYPE_IMAGE = 1;
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
下一步是我的 onActivityResult 方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if the result is capturing Image
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
launchUploadActivity(true);
....
这是我的 launchUploadActivity
private void launchUploadActivity(boolean isImage){
System.out.println("Bild: launchUploadActivity");
String filePath = fileUri.getPath();
if (filePath != null) {
previewMedia(filePath);
}
}
问题来了!有时带有 "fileUri.getPath();" 的行会抛出空指针异常。我不知道为什么它有时会起作用。特别是当我第一次启动应用程序时,它似乎崩溃了。
谢谢你帮我!
您是否使用 onSaveInstanceState
和 oncreate
保存并恢复了字段 fileUri
?
我认为错误发生在重新创建 activity 时,因为您在拍照时切换了方向。
编辑:
例如
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("file_uri", fileUri.toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// your code
if(savedInstanceState!=null) {
fileUri = Uri.parse(savedInstanceState.getString("file_uri"));
}
}
感谢@Derek Fung 正是我要找的! :-)
对于所有其他人:这两种方法是强制性的!
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save file url in bundle as it will be null on screen orientation
// changes
outState.putParcelable("file_uri", fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the file url
fileUri = savedInstanceState.getParcelable("file_uri");
}