2017-09-15 77 views
0

我从我的片段开始了标准的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); 
    } 
} 
+0

这是因为你的片段永远不会在onActivityResult()中得到结果。你必须相应地修改你的活动到这个职位:https://stackoverflow.com/questions/6147884/onactivityresult-is-not-being-called-in-fragment – canihazurcode

回答

1

我尝试使用意图和从相同的片段调用onActivetyResult()。但是onActivityResult()永远不会被调用。

那是因为你对Activity调用startActivityForResult(),而不是片段。您的onActivityResult()方法会出现在您拨打startActivityForResult()的对象上。所以,如果你想片段有onActivityResult(),请在片段上调用startActivityForResult()。基于这个帖子

+0

我现在调用它的片段和'onActivtityResult() '被召唤。谢谢!但不知何故onActivityResult()中的数据意图为空......你知道为什么吗?我把我的数据意图如下:'takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile)); takePictureIntent.putExtra(Constants.IMAGE_FILE_NAME,currentFileName); fragment.startActivityForResult(takePictureIntent,Constants.TAKE_PHOTO);' –

+0

@HansiHansenbaum:“但不知何故onActivityResult()中的数据意图为空......你知道为什么吗? - 它应该是'null'。你知道图像应该在哪里('photoFile')。 – CommonsWare

+0

对不起,这些愚蠢的问题。但是,如何从意图传递一个字符串到onActivityResult()? –

2

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()

相关问题