【问题标题】:onActivityResult not called after taking a photo in Android在Android中拍照后未调用onActivityResult
【发布时间】:2014-01-29 03:24:42
【问题描述】:

我正在使用此代码,但我的 onActivityResult 从未被调用。我曾经提出请求,但没有传递将图像保存到 SD 卡的额外意图,并且效果很好 - onActivityResult() 会按照我的预期被调用。但是因为我添加了 SD 卡代码 - 运气不好!

我是否添加(或遗漏)了什么?我以https://stackoverflow.com/a/12277455/2884981 为例。

这是我的代码,

    static final int CAPTURE_IMAGE_CALLBACK = 1;

    private void dispatchTakePictureIntent() 
    {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    File photo = null;
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
        {
            photo = new File(android.os.Environment.getExternalStorageDirectory(), "myapp/images/" + File.separator + timeStamp + ".png");
        } 
        else 
        {   
            photo = new File(getCacheDir(), "myapp/images/" + File.separator + timeStamp + ".png");
        }  
        if ( photo != null)
        {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
        }

        if (takePictureIntent.resolveActivity(getPackageManager()) != null) 
        {
            startActivityForResult(takePictureIntent, CAPTURE_IMAGE_CALLBACK);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        // This never gets hit!
        if (requestCode == CAPTURE_IMAGE_CALLBACK) 
        {
              // etc

我只是想在单击勾选后在相机应用程序中添加 - 没有任何反应。我反复点击勾号,它只是停留在相机屏幕上。控制权永远不会返回到主应用程序。

【问题讨论】:

标签: android android-camera android-sdcard


【解决方案1】:

我需要添加这个:

    photo.getParentFile().mkdirs();
    photo.createNewFile();

我认为它失败的原因是因为我试图写入图像的文件不存在。

【讨论】:

  • 兄弟这两行代码应该放在哪里?在 onActivityResult 里面?
  • dispatchTakePictureIntent()里面,我在if (photo != null)区域添加了。
【解决方案2】:

我使用这样的东西,它工作正常:

public class MainActivity extends Activity implements OnClickListener {

Button btnTackPic;
Bitmap bitMap;
static int TAKE_PICTURE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Setup camera ready for picture clicking

    // add onclick listener to the button
    btnTackPic.setOnClickListener(this);

}

// Take pic
@Override
public void onClick(View view) {

    // create intent with ACTION_IMAGE_CAPTURE action 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    // start camera activity
    startActivityForResult(intent, TAKE_PICTURE);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == TAKE_PICTURE && resultCode== RESULT_OK && intent != null){
        // get bundle
        Bundle extras = intent.getExtras();

        // get bitmap
        bitMap = (Bitmap) extras.get("data");
    }
}

}

【讨论】:

  • 嗨。是的,我可以做同样的事情,只是当我添加 SD 卡代码时我遇到了麻烦。我需要 SD 卡代码能够正常工作以及像您一样读取缩略图数据。
  • 拍照后不应该刷SD卡码吗?即将该代码移动到 onActivityResult 方法中,然后确保您有照片要保存。
  • 不,您需要将要保存 SD 卡的文件传入 Intent。然后我相信照片的高分辨率副本将保存到该文件中。如果您在将图像返回到 onActivityResult 后尝试保存到 SD 卡,您将得到低分辨率位图/缩略图。 (我相信无论如何都是这样,一旦我开始工作,我就可以确认!!)
  • 啊,好吧,看来您已经对自己进行了一些测试。祝你好运
【解决方案3】:

在我的情况下,onDestroy 改为调用。因为android系统会尝试释放内存(如果我们的应用程序在后台,并且我们打开相机应用程序),以及它从未调用onActivityResult方法的原因也是由于这个原因,请确保您没有使用noHistory=trueintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)

例如

// AbcActivity.kt
val intent = Intent(AbcActivity.this, RegistrationForm.class)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
startActivity(intent)

// RegistrationForm.kt
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
// do take pictures, and confirm the photo, never going back to the RegistrationForm, instead back to AbcActivity

通过删除标志和noHistory=true(在AndroidManifest.xml 中)我的活动重新创建并再次调用onActivityResult,但我们需要使用ViewModel 或(onSaveInstance & onRestoreInstance)保存之前的状态

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2015-12-28
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多