意图选择器中不显示相机意图

时间:2015-05-22 04:44:49

标签: android android-intent camera

String chooseTitle = activity.getString(R.string.select_or_take_picture);

Intent getIntent = new Intent();
getIntent.setType("image/*");
getIntent.setAction(Intent.ACTION_GET_CONTENT);

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
PackageManager pm = activity.getApplicationContext().getPackageManager();
for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent, PackageManager.MATCH_DEFAULT_ONLY)) {
  Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
  intent.setAction(Intent.ACTION_PICK);
  intents.add(intent);
}

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, photoUri);
for (ResolveInfo ri : pm.queryIntentActivities(cameraIntent, 0)) {
  Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
  intents.add(intent);
}

Intent chooserIntent = Intent.createChooser(getIntent, chooseTitle);
chooserIntent.putExtra(
    Intent.EXTRA_INITIAL_INTENTS,
    intents.toArray(new Parcelable[] {})
);

通过这种方式,选择器显示:

Effect when I passed photoUri

相机意图根本没有显示。

但如果我改变了行

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, photoUri);

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

它运作得很好:

enter image description here

但问题是,我真的想通过photoUri。我该怎么办呢?

我知道一个可能的选择是编写我自己的选择器对话框,但我确实想知道它是意图选择器中的错误,还是我没有正确使用它。

P.S。 @dkarmazi,这是我如何生成Uri:

public Uri generatePhotoUri() {
  String timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
  String imageFileName = "XXX_" + timeStamp + ".jpg";
  File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES);
  File imageFile = new File(storageDir, imageFileName);
  return Uri.fromFile(imageFile);
}

这是我的onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch (requestCode) {
    case PICK_PHOTO:
      if (resultCode != Activity.RESULT_OK) {
        break;
      }
      Uri source = data == null ?
          mPhotoUri : // take picture
          data.getData(); // choose from other app
      if (source == null) {
        break;
      }
      // TODO: do with source
      break;
  }
  //....
}

@dkarmazi,我调试了它,并确保resultCode为RESULT_CANCELED

2 个答案:

答案 0 :(得分:2)

我最近处理过同样的问题,这是我的解决方案:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

然后,一旦用户拍照,您应该可以使用提供的photoUri访问它

以下是EXTRA_OUTPUT的一些文档,您还可以在同一页面上查找ACTION_IMAGE_CAPTURE。

Intent Chooser更新:

// we create intent chooser by picking one of the intents
Intent chooserIntent = Intent.createChooser(cameraIntent, getResources().getString(R.string.pick_action_string_for_user));
// then we add any additional intents
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { getIntent });
// chooserIntent is ready
startActivityForResult(chooserIntent, requestCode);

答案 1 :(得分:0)

非常感谢@dkarmazi帮助我调试此问题。我们似乎没有足够的声誉来共同完善答案,所以我在这里发布解决方案。在我们聊天的后期,我们发现了一个可能的原因,在我的实验之后,现在它可以工作了。我收集cameraIntent的方式实际上是一个问题,因此请更改此部分代码

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, photoUri);
for (ResolveInfo ri : pm.queryIntentActivities(cameraIntent, 0)) {
  Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
  intents.add(intent);
}

final Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
for(ResolveInfo ri : pm.queryIntentActivities(cameraIntent, 0)) {
  final String packageName = ri.activityInfo.packageName;
  final Intent intent = new Intent(cameraIntent);
  intent.setComponent(new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name));
  intent.setPackage(packageName);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
  intents.add(intent);
}

还需要改变

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
PackageManager pm = activity.getApplicationContext().getPackageManager();
for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent, PackageManager.MATCH_DEFAULT_ONLY)) {
  Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
  intent.setAction(Intent.ACTION_PICK);
  intents.add(intent);
}

Intent galleryIntent = new Intent(Intent.ACTION_PICK);
galleryIntent.setType("image/*");
PackageManager pm = activity.getApplicationContext().getPackageManager();
for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent, PackageManager.MATCH_DEFAULT_ONLY)) {
  final String packageName = ri.activityInfo.packageName;
  final Intent intent = new Intent(galleryIntent);
  intent.setComponent(new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name));
  intent.setPackage(packageName);
  intents.add(intent);
}

我讨厌它的样板,但最终还是有效。