8

ギャラリーから、またはカメラで写真を撮ることによって、ユーザーが画像を選択できるようにしようとしています。私はこれを試しました:

        Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
        imageIntent.setType("image/*");
        startActivityForResult(Intent.createChooser(imageIntent, "Select Picture"), GET_IMAGE_REQUEST);

ただし、アクティビティを選択するオプションを提供しなくても、ギャラリーが自動的に表示されます。この質問で与えられた解決策よりも、これを達成するためのより良い方法があるはずです。それが本当に唯一の方法ですか?

4

2 に答える 2

14

いくつかのソリューションをマージして、ギャラリーまたはカメラから画像を選択するための完全なユーティリティを作成しました。これらはImagePickerutilの機能です(Github libにもあります):

  • ギャラリーとカメラのリクエストのインテントを統合しました。
  • 選択した大きな画像のサイズを変更します(例:2500 x 1600)
  • 必要に応じて画像を回転させる

スクリーンショット:

ImagePicker開始インテント

編集:ギャラリーアプリとカメラアプリのインテントを統合するためのコードの断片を次に示します。完全なコードはImagePickerutilGithub libにもあります)で確認できます。

public static Intent getPickImageIntent(Context context) {
    Intent chooserIntent = null;

    List<Intent> intentList = new ArrayList<>();

    Intent pickIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra("return-data", true);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context)));
    intentList = addIntentsToList(context, intentList, pickIntent);
    intentList = addIntentsToList(context, intentList, takePhotoIntent);

    if (intentList.size() > 0) {
        chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1),
                context.getString(R.string.pick_image_intent_text));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{}));
    }

    return chooserIntent;
}

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
    List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
    for (ResolveInfo resolveInfo : resInfo) {
        String packageName = resolveInfo.activityInfo.packageName;
        Intent targetedIntent = new Intent(intent);
        targetedIntent.setPackage(packageName);
        list.add(targetedIntent);
    }
    return list;
}
于 2015-09-09T09:26:09.410 に答える
7

このロジックはアプリ内で実行する必要があります。ギャラリーからの画像の選択とカメラを使用した写真の撮影は、異なる意図を使用しています。

ボタン(またはユーザーにアクションを選択させるためのUI)を使用し、両方のアクションに対して2つの別個のメソッドを作成することをお勧めします。たとえば、とという名前の2つのボタンを作成したbtnPickGalleryとしbtnTakePictureます。

両方のボタンは、独自のアクションを起動onBtnPickGalleryonBtnTakePictureます。

public void onBtnPickGallery() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_REQUEST_CODE);
}

public void onBtnTakePicture() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = new File(Environment.getExternalStorageDirectory(), "dir/pic.jpg");

    Uri outputFileUri = Uri.fromFile(photo);

    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}

そして、onActivityResult()メソッドを使用して結果を取得できます。

于 2011-06-02T19:16:45.740 に答える