Android相机照片回来了null

时间:2015-12-06 16:02:42

标签: android android-camera-intent

在我的Android应用程序中,我使用相机活动,有时可以工作,有时也不会。即使相机图片存储在手机的图片目录中,uri设置存储照片的大约30%的时间也会返回空值。以下是我的开始活动。

--export-png

以下是我的结果活动。

public Dialog onCreateDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // Get the layout inflater
    LayoutInflater inflater = this.getLayoutInflater();
    Log.i("INFO","Creating Dialog...");
    View view = inflater.inflate(R.layout.goaldialog, null);
    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(view)
            // Add action buttons
            .setPositiveButton(R.string.SetAGoalButton, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    EditText et = (EditText)view.findViewById(R.id.GoalChooser);
                    Integer goalNumber = Integer.parseInt(et.getText().toString());
                    globalVariable = goalNumber;
                    Log.i("INFO",Integer.toString(goalNumber));
                    dialog.dismiss();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
    builder.show();
    return builder.create();
}

问题是变量imageUri偶尔会返回null,即使照片已拍摄并位于Samsung S4手机图片目录中。任何人都可以解释为什么会发生这种情况以及如何解决它?如果返回空值,是否有其他方法来捕获照片?我应该补充说我在Android SDK版本23上。我没有用来解决这个问题。

我有关于这个问题的更多信息。我在startactivity中设置了我的imagepath,如下所示:

  Uri imageUri;       // These are defined at the global level
  Uri selectedImage;
     ...............
  String fileName = name.replace(" ", "");
            fileName = fileName + suffix + ".jpg";
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, fileName);
            values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");
                 imageUri = getContentResolver().insert(
                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

            if (intent.resolveActivity(getPackageManager()) != null) {
                 startActivityForResult(intent, RESULT_LOAD_IMAGE);
            }
            else
                Toast.makeText(getApplicationContext(), "Photo was not taken", Toast.LENGTH_SHORT).show();

在我的结果活动中,我为mCurrentPhotoPath获取null。是什么导致这种情况被彻底消灭?我没有在导致它变为空的任何其他地方引用mCurrentPhotoPath。

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Bitmap image1;
        if(requestCode == RESULT_CROP_IMAGE)
        {
            Bundle extras = data.getExtras();
             image1 = extras.getParcelable("data");
        }
        else {
            if (requestCode == RESULT_LOAD_IMAGE) {
               selectedImage = imageUri;   // returns null occassionally
          } else
                  selectedImage = data.getData();
        if(selectedImage == null)
            {
                Toast.makeText(getApplicationContext(), "Photo not captured correctly", Toast.LENGTH_LONG).show();
                return;
            }

有人可以解释为什么当我没有在开始活动和结果活动以外的任何其他地方引用它时,mCurrentPath会返回空值吗?

2 个答案:

答案 0 :(得分:4)

  

任何人都可以解释为什么会发生这种情况

根据{{​​3}},

ACTION_IMAGE_CAPTURE不会返回Uri。您的代码中的data.getData()应始终为null。如果不是null,那么Uri意味着没有记录。

  

如何解决?

您已经知道Uri是什么。你把它放在EXTRA_OUTPUT。用那个。

  

我没有用来解决这个问题。

是的,你做到了。有数以千计的Android设备型号。它们内置了数十个(如果不是数百个)相机应用程序。有许多(如果不是数百个)额外的ACTION_IMAGE_CAPTURE支持应用程序,可以从Play商店等地方下载。他们都不必返回Uri,因为文档没有说他们必须返回Uri(即便如此,相机应用程序中也存在错误)。

答案 1 :(得分:2)

感谢CommonsWare我通过实现onSaveInstance状态解决了这个问题。这应该是任何Android相机文档的必需信息,因为每当您更改相机的方向时都会丢失全局变量。

       @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putParcelable("myURI", imageUri);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
    // Restore state members from saved instance
   imageUri = savedInstanceState.getParcelable("myURI");

}