在Android中拍照后未调用onActivityResult方法

4
我正在使用这段代码,但我的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

我只是想补充一下,在相机应用程序内,当我点击勾选标志后,什么都没有发生。我多次点击勾选标志,它仍然停留在相机屏幕上。控制权从未返回到主应用程序。

我之前已经回答过这个问题了,请看这里:https://dev59.com/Wl3Va4cB1Zd3GeqPE-za#30266776 - sadegh saati
3个回答

7

我需要补充一下:

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

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

1
兄弟,这两行代码应该放在哪里?在onActivityResult方法里吗? - Wei Keat
dispatchTakePictureIntent() 函数内,我将其添加到 if (photo != null) 区域中。 - b85411

1
我使用类似这样的东西,它可以正常工作:

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卡代码能够正常工作,并像您一样读取缩略图数据。 - b85411
你的SD卡代码不应该在拍照之前就完成吗?也就是说,将该代码移入onActivityResult方法中,因为这样可以确保你有一张要保存的照片。 - Carlos Taylor
不,你需要将要保存到SD卡中的文件传递给意图。然后我相信照片的高分辨率副本将保存在该文件中。如果你在将图像返回到onActivityResult之后尝试保存到SD卡,你将只得到低分辨率的位图/缩略图。(我相信这是情况,一旦我把它搞定了就可以确认!) - b85411
啊,好的,看起来你自己已经做了一些测试。祝你好运。 - Carlos Taylor

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

e.g

// 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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接