7

ファイルから画像を選択するか、画像を作成するためのセレクターを作成しました。

私が使用するコードは Nexus 5 では正常に動作しますが、Samsung S5 で試してみると、セレクターにカメラ アイコンが表示されません。

public Intent makePhotoIntent(String title, Context ctx, String uniqueImageId){

        //Build galleryIntent
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        galleryIntent.setType("image/*");

        //Create chooser
        Intent chooser = Intent.createChooser(galleryIntent,title);

        if (checkexCameraHardware()){
            Intent  cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            mTempImage = null;
            try {
                mTempImage = createImageFile(uniqueImageId);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (mTempImage != null){
                cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempImage)); //add file ure (photo is saved here)
                Intent[] extraIntents = {cameraIntent};
                chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
            }
        }
        return chooser;
    }

サムスンネクサス

インテントがセレクターに追加される順序を変更すると、Samsung デバイスはカメラを表示しますが、ファイル オプションとして android-system のみを表示します。

public Intent makePhotoIntent(String title, Context ctx, String uniqueImageId){

        //Build galleryIntent
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        galleryIntent.setType("image/*");

        //Create chooser
        Intent chooser = Intent.createChooser(galleryIntent,title);

        if (checkexCameraHardware()){
            Intent  cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            mTempImage = null;
            try {
                mTempImage = createImageFile(uniqueImageId);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (mTempImage != null){
                cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempImage)); //add file ure (photo is saved here)

                //I have to re-create the chooser here or the Samsung will not show the 'camera' icons.
                //I have to add the cameraIntent first.
                chooser = Intent.createChooser(cameraIntent,title);
                Intent[] extraIntents = {galleryIntent};

                //Intent[] extraIntents = {cameraIntent};
                chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
            }
        }
        return chooser;
    }

サムスン ネクサス

理想的には、最初にギャラリー インテントを追加したときに、Samsung デバイスが Nexus デバイスと同じように表示されるようにしたいと考えています。しかし、これを機能させることはできません。

4

3 に答える 3

8
  • 追加のインテント ( ) に一致するインテントが複数ある場合は、それらすべてが「Android システム」Intent.EXTRA_INITIAL_INTENTSの下にまとめて表示されます。「Android System」をクリックすると、それらすべての意図が一致する別のセレクターが開きます。

  • したがって、samsung デバイスの最初のスクリーンショットでは、カメラが実際に表示されています。「Android システム」のすぐ下にあります (これをクリックすると、すべてのカメラ インテントの一致が表示されます)。

  • カメラ インテントの代わりにエクストラを作成するgalleryIntentと、ギャラリーに関連するすべてのインテントが「Android システム」の下に結合されます (samsung デバイスの 2 番目のスクリーンショットを参照)。

この「Android Systeem」が何であるかを知らないと、ユーザーは混乱する可能性があると思います。

  • 以下のソリューションを使用すると、それぞれを直接追加できますchooser

    2 番目のコード スニペットで、置き換えます

    Intent[] extraIntents = {galleryIntent};
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    

    と :

    List<Intent> galleryIntents = new ArrayList<Intent>();
    PackageManager pm = getApplicationContext().getPackageManager();
    for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent, PackageManager.MATCH_DEFAULT_ONLY)) {
        Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName);
        intent.setAction(Intent.ACTION_PICK);
        galleryIntents.add(intent); 
    }
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, galleryIntents.toArray(new Parcelable[] {}));
    

これにより、一致する各インテントが手動で直接chooser

于 2014-10-18T00:20:49.170 に答える