在Android中使用相机应用程序后打开DialogFragment
我从我的片段开始了标准的Android相机应用程序。一切工作正常,图像得到保存,因为我希望。在用户拍摄照片(并且只有这样)之后,我想启动一个DialogFragment。在Android中使用相机应用程序后打开DialogFragment
我尝试使用intent并从同一个片段调用onActivetyResult()
。但onActivityResult()
永远不会被调用。
我在片段如何启动相机:
MyCamera camera = new MyCamera(getActivity());
camera.start();
林我MyCamera类我开始像这样的意图:
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
activity.startActivityForResult(takePictureIntent, Constants.TAKE_PHOTO);
回到我打电话onActivityResult的片段() :
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.TAKE_PHOTO && resultCode == Activity.RESULT_OK) {
// do something
}
}
我该如何完成这项任务?先谢谢您的帮助!
这里整个MyCamera类:
public class MyCamera {
private Activity activity;
private static final String TAG = "MyCamera";
private String currentPhotoPath;
private String currentFileName;
private File currentFile;
private Uri contentUri;
public MyCamera(Activity activity) {
this.activity = activity;
}
public void start() {
dispatchPictureIntent();
addPictureToGallery();
currentPhotoPath = null;
}
private void dispatchPictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// check if device has camera
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
currentPhotoPath = photoFile.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(activity, R.string.msg_picture_not_saved, Toast.LENGTH_LONG).show();
}
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
takePictureIntent.putExtra(Constants.IMAGE_FILE_NAME, currentFileName);
activity.startActivityForResult(takePictureIntent, Constants.TAKE_PHOTO);
}
}
}
private File createImageFile() throws IOException {
// set up storage dir
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
if (!storageDir.exists()) {
if (!storageDir.mkdirs()) {
Log.e(TAG, "failed to create directory");
return null;
}
}
// set up file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String fileName = "img_" + timeStamp + "_";
String suffix = ".jpg";
File image = File.createTempFile(fileName, suffix, storageDir);
currentFileName = image.getName();
currentFile = image;
return image;
}
private void addPictureToGallery() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
contentUri = getUri(currentPhotoPath);
mediaScanIntent.setData(contentUri);
activity.sendBroadcast(mediaScanIntent);
}
private Uri getUri(String currentPhotoPath) {
File f = new File(currentPhotoPath);
return Uri.fromFile(f);
}
}
我尝试使用意图和从相同的片段调用onActivetyResult()。但是onActivityResult()永远不会被调用。
那是因为你对Activity
调用startActivityForResult()
,而不是片段。您的onActivityResult()
方法会出现在您拨打startActivityForResult()
的对象上。所以,如果你想片段有onActivityResult()
,请在片段上调用startActivityForResult()
。基于这个帖子
我现在调用它的片段和'onActivtityResult() '被召唤。谢谢!但不知何故onActivityResult()中的数据意图为空......你知道为什么吗?我把我的数据意图如下:'takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile)); takePictureIntent.putExtra(Constants.IMAGE_FILE_NAME,currentFileName); fragment.startActivityForResult(takePictureIntent,Constants.TAKE_PHOTO);' –
@HansiHansenbaum:“但不知何故onActivityResult()中的数据意图为空......你知道为什么吗? - 它应该是'null'。你知道图像应该在哪里('photoFile')。 – CommonsWare
对不起,这些愚蠢的问题。但是,如何从意图传递一个字符串到onActivityResult()? –
:onActivityResult is not being called in Fragment
尝试在托管活动
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
这将允许活动结果传递未处理你的片段加入。
此外,请确保您拨打fragment.startActivityForResult()
而不是activity.startActivityForResult()
。
这是因为你的片段永远不会在onActivityResult()中得到结果。你必须相应地修改你的活动到这个职位:https://stackoverflow.com/questions/6147884/onactivityresult-is-not-being-called-in-fragment – canihazurcode