【问题标题】:onActivityResult is only called after pushing the backbuttononActivityResult 仅在按下后退按钮后调用
【发布时间】:2016-04-10 22:07:01
【问题描述】:

我现在正在学习使用 android 编程,并且我构建了一个应用程序,通过本教程使用相机拍照。

http://developer.android.com/training/camera/photobasics.html

但onActivity不会自动调用,只有在我用设备拍照后按下返回按钮时才会调用。

package com.olchowski.valentin.cam2dial;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends Activity {

    static final int REQUEST_IMAGE_CAPTURE = 1;
    String mCurrentPhotoPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);


    if (intent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show();
        }

        if (photoFile != null) {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
            startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
        } else {
            Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show();
        }
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Toast.makeText(this, "RENDERING", Toast.LENGTH_SHORT).show();
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Toast.makeText(this, "PHOTO TAKEN", Toast.LENGTH_SHORT).show();
        finish();
    }
}

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(imageFileName,".jpg", storageDir);
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}
}

【问题讨论】:

  • 你的意思是你按下相机应用程序中的BACK按钮,然后你的activity中的onActivityResult()被调用了吗?
  • 是的,当我启动应用程序时,我可以随心所欲地拍摄任何照片。在我按下后退按钮后, onActivityResult() 被调用。但我想在拍完一张照片后被叫到用户点击确定或保存按钮。

标签: android android-studio


【解决方案1】:

ACTION_IMAGE_CAPTURE 的行为取决于相机应用。有数千种设备型号,附带数百种不同的相机应用程序。此外,还有可从 Play 商店和其他地方下载的相机应用程序。

有些有错误。

在这种情况下,ACTION_IMAGE_CAPTURE应该在用户拍照后返回您的应用。无论出于何种原因,这个相机应用程序的实现者选择不这样做,或者没有很好地测试ACTION_IMAGE_CAPTURE

除了不使用ACTION_IMAGE_CAPTURE(例如,直接使用相机API)之外,您实际上无能为力。

【讨论】:

  • 这是正确的提示 ;-)。我用另一台设备试了一下,它可以按我的意愿工作。谢谢!
【解决方案2】:

我认为您的问题是由于使用createTempFile() 方法,您使用相机拍摄的照片无法正确保存在磁盘上。 您还应该提供一些有关您用于测试的 android 版本以及更多详细信息的信息。 您使用时间戳来命名相机拍摄的照片,默认情况下它保证您的文件名是唯一的。所以使用createTempFile() 方法是多余的。我用new File() 创建方法尝试了你的代码,它工作正常。

【讨论】:

    【解决方案3】:

    onActivityResult() 在您调用的 Activity 关闭时被调用,因此这是预期的行为。

    按“返回”键关闭 Activity,以便传递结果。

    您无法从仍处于打开状态的 Activity 中获得结果。

    【讨论】:

    • 好的,那我怎样才能在拍照后自动关闭Activity呢?
    • 你可能不能,但我认为这取决于你使用的相机应用程序。
    【解决方案4】:

    如果这是您无法企及的限制,那么最好的选择是创建您的自定义活动以通过相机进行捕捉。 Here 是一个关于如何完成的示例。我没有测试过。但是,您应该能够弄清楚,因为它看起来并不复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2012-12-26
      • 1970-01-01
      • 2021-04-20
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多