在Android中使用摄像头应用程序后打开DialogFragment
我从我的标准android摄像头应用程序开始。一切正常,图像按我的意愿保存。在用户拍了一张照片之后(只有在那时),我想启动一个DialogFragment 我尝试使用intent并从同一个片段调用在Android中使用摄像头应用程序后打开DialogFragment,android,android-fragments,Android,Android Fragments,我从我的标准android摄像头应用程序开始。一切正常,图像按我的意愿保存。在用户拍了一张照片之后(只有在那时),我想启动一个DialogFragment 我尝试使用intent并从同一个片段调用onActivityResult()。但是从未调用过activityresult() 如何在片段中启动摄影机: MyCamera camera = new MyCamera(getActivity()); camera.start(); 我是我的MyCamera班级我开始这样做: ta
onActivityResult()
。但是从未调用过activityresult()
如何在片段中启动摄影机:
MyCamera camera = new MyCamera(getActivity());
camera.start();
我是我的MyCamera班级我开始这样做:
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
activity.startActivityForResult(takePictureIntent, Constants.TAKE_PHOTO);
回到我在ActivityResult()上调用的片段:
我怎样才能完成这项任务?提前感谢您的帮助
下面是整个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);
}
}
我尝试使用intent并从同一个片段调用onActivityResult()。但是onActivityResult()永远不会被调用
这是因为您在活动
上调用的是startActivityForResult()
,而不是在片段上。您的onActivityResult()
方法在调用startActivityForResult()的对象上运行。因此,如果希望片段具有onActivityResult()
,请在片段上调用startActivityForResult()
我尝试使用intent并从同一个片段调用onActivityResult()。但是onActivityResult()永远不会被调用
这是因为您在活动
上调用的是startActivityForResult()
,而不是在片段上。您的onActivityResult()
方法在调用startActivityForResult()的对象上运行。因此,如果您希望片段具有onActivityResult()
,请在片段上调用startActivityForResult()
。基于本文:
尝试添加您的托管活动
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
它将允许将未处理的活动结果传递给您的片段
另外,请确保根据以下帖子调用fragment.startActivityForResult()
,而不是activity.startActivityForResult()
:
尝试添加您的托管活动
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
它将允许将未处理的活动结果传递给您的片段
另外,请确保调用fragment.startActivityForResult()
而不是activity.startActivityForResult()
这是因为您的片段从未在onActivityResult()中获得结果。您必须根据本文修改您的活动:这是因为您的片段从未在onActivityResult()中得到结果。你必须根据这篇文章相应地修改你的活动:我现在在片段上调用它,并调用onActivityResult()
。非常感谢。但不知何故,onActivityResult()中的数据意图为空。。。你知道为什么吗?我将数据放在如下意图中:takePictureContent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(photoFile));takePictureContent.putExtra(常量.IMAGE\u文件名,当前文件名);fragment.startActivityForResult(takePictureIntent,Constants.TAKE_PHOTO)
@HansiHansenbaum:“但不知何故,onActivityResult()中的数据意图是空的……你知道为什么吗?”--它应该是null
。你知道图像应该在哪里(photoFile
)。很抱歉问了这些愚蠢的问题。但是如何将一个字符串从intent传递到onActivityResult()?@HansiHansenbaum:在片段的一个字段中保留它,您已经在该字段上实现了onActivityResult()
。我必须声明属性final,因为片段当然是在拍照后重建的。这不是很漂亮,但很管用。谢谢你的帮助!我现在在片段上调用它,调用了onActivityResult()
。非常感谢。但不知何故,onActivityResult()中的数据意图为空。。。你知道为什么吗?我将数据放在如下意图中:takePictureContent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(photoFile));takePictureContent.putExtra(常量.IMAGE\u文件名,当前文件名);fragment.startActivityForResult(takePictureIntent,Constants.TAKE_PHOTO)
@HansiHansenbaum:“但不知何故,onActivityResult()中的数据意图是空的……你知道为什么吗?”--它应该是null
。你知道图像应该在哪里(photoFile
)。很抱歉问了这些愚蠢的问题。但是如何将一个字符串从intent传递到onActivityResult()?@HansiHansenbaum:在片段的一个字段中保留它,您已经在该字段上实现了onActivityResult()
。我必须声明属性final,因为片段当然是在拍照后重建的。这不是很漂亮,但很管用。谢谢你的帮助!