如何从呼叫意图回去

Jam*_*mes 5 camera android android-intent

我打电话给相机拍照.但拍完照片后我无法回到原来的活动.有什么问题?谢谢.

    public void addEntry(View view)
{
              String EntryName=RegisterName.toString();
              Toast.makeText(this, EntryName, Toast.LENGTH_LONG);
              Intent addEntryintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              File file = new File(getFilesDir(),EntryName);
              registeryFileUri = Uri.fromFile(file);
              addEntryintent.putExtra(MediaStore.EXTRA_OUTPUT, registeryFileUri);
              startActivityForResult(addEntryintent,TAKE_PICTURE);         

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == TAKE_PICTURE) 
      {
          if (data != null)
          {   
         Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG);
         ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture);
         Registerimage.setImageURI(registeryFileUri);
         }

    }
  }
Run Code Online (Sandbox Code Playgroud)

Tom*_*ger 7

我花了一段时间才使它工作,我做了几件事,最后它起作用了.我无法确定我所做的是解决问题的方法,但它们共同形成了可行的解决方案.

相机活动无法返回的原因有很多.两个主要的是:

  1. 新图片的路径无效,或者不存在,或者无法创建

  2. 应用程序被暂停并保存路径丢失.

所以这是我的代码解决所有这些问题,一起工作.

首先我创建了帮助类ImageServices:

class ImageServices {

  private static String getTempDirectoryPath(Context ctx) {
    File cache;

    // SD Card Mounted
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      cache = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
              "/Android/data/" + ctx.getPackageName() + "/cache/");
    }
    // Use internal storage
    else {
      cache = ctx.getCacheDir();
    }

    // Create the cache directory if it doesn't exist
    if (!cache.exists()) {
      cache.mkdirs();
    }

    return cache.getAbsolutePath(); 
  }

  public static Uri getOutputImageFileUri(Context ctx) {
    // TODO: check the presence of SDCard

    String tstamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File file = new File(getTempDirectoryPath(ctx), "IMG_" + tstamp + ".jpg");

    return Uri.fromFile(file);

  }
}
Run Code Online (Sandbox Code Playgroud)

该代码部分受developer.android.com的启发,部分受Apache Cordova项目的CameraLauncher类的启发.

在我的活动中,用于拍照的按钮的事件处理程序如下所示:

private Uri imageFileUri;

private static final int MAKE_PHOTO_RESULT_CODE = 100;
private static final int PICK_PHOTO_RESULT_CODE = 101;

public void onMakePhoto(View v) {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  imageFileUri = ImageServices.getOutputImageFileUri(this);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);
  Log.i("babies", "Taking picture: requested " + imageFileUri);
  startActivityForResult(intent, MAKE_PHOTO_RESULT_CODE);
}
Run Code Online (Sandbox Code Playgroud)

方法onActivityResult实际上并不多,因为imageFileUri已经指向现有文件,并且必要的渲染是在onResume方法中完成的,当活动返回到前台时调用该方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode == RESULT_OK) {
    switch(requestCode) {
      case MAKE_PHOTO_RESULT_CODE:
        assert imageFileUri != null;
        break;
      case ...
        ...other cases...
        break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这仍然不够,imageFileUri因为您的应用程序被暂停时会丢失.在常规设备上,机率接近100%.接下来你需要存储imageFileUri实例状态的值:

@Override
protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  if (imageFileUri == null) {
    outState.putString("file-uri", "");
  }
  else {
    outState.putString("file-uri", imageFileUri.toString());
  }
};
Run Code Online (Sandbox Code Playgroud)

再加载 - 最简单的是直接onCreate:

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  if (savedInstanceState != null) {
    String fileUri = savedInstanceState.getString("file-uri");
    if (!fileUri.equals("")) imageFileUri = Uri.parse(fileUri);
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,除了本网站以及其他地方提供的许多其他解决方案之外,还有两个主要差异:

  1. getTempDirectoryPath由Apache Cordova启发的更智能
  2. 允许imageFileUri生存暂停申请

现在 - 至少对我来说 - 一切正常.


KK_*_*585 4

回答

使用appContext.getExternalCacheDir()并且不要忘记提及权限。

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              if (requestCode == TAKE_PICTURE) 
              {
                      if(resultCode==Activity.RESULT_OK)
                  { //if (data != null)
                    //{   
                    Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG);
                    ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture);
                    Registerimage.setImageURI(registeryFileUri);
                    //}
                       }
                      else
                         Toast.makeText(this, "Not Registered!", Toast.LENGTH_LONG);
             }  
**"android.permission.CAMERA"**     

Check whether the above permission is specified in your manifest or not

Note: It's better to use getExternalCacheDir() than getFilesDir() if you still dont get the 
      image then use that. Dont forgot to specify the permission "android.permission.WRITE_EXTERNAL_STORAGE" if you use the getExternalCacheDir().
Run Code Online (Sandbox Code Playgroud)