Java活用生活

ログイン

オンライン状況

オンラインユーザー1人
ログインユーザー0人
登録ユーザー2人

カウンタ

COUNTER335469

Androidスニペット

Androidスニペット >> 記事詳細
2024/03/06

非推奨のstartActivityForResultの呼び出し元判別

固定リンク | by:aramaki
startActivityForResultの呼び出し
が非推奨となったが、代替のActivityResult API
では、※リクエストコードを利用して、呼び出し元を
判別する仕組みはなかったので、自分でクラスを
作成して動作確認しました。

※requestCodeは、ActivityResult API側で作成し
インクリメントして利用している。

今回は、ボタン押下で、ギャラリー呼び出しをする。
そのとき、ユーザーは、リクエストコード(reqest_code)を
設定する。
ギャラリーから画像を選択し、呼び出し元に戻ったら、
トーストで、ユーザーが設定したリクエストコードを
表示するという流れです。


       

MainActivity.java
---------------------------------------
public class MainActivity extends AppCompatActivity {



    private Button btnStart;
    /** ギャラリー表示用リクエストコード */
    private static final int GALLARY_INTENT_CALLED = 302;

    /** アクティビティコール用のリクエストコード */
    private static final int ACTIVITY_CALLED = 201;


    private final ActivityResultLauncher<Intent> activityResultLauncher
            = registerForActivityResult(
                    new MyResultContract(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        Intent intent=result.getData();
                        int code=intent.getIntExtra("request_code",0);

                        // --------------------------
                        // code(呼び出し先判別のコード)により処理を分岐する
                        // ---------------------------
                        switch (code){
                            case GALLARY_INTENT_CALLED:
                                // 処理 ①
                                break;
                            case ACTIVITY_CALLED:
                                // 処理 ②
                                break;
                            default:
                                break;
                        }


                        Toast.makeText(MainActivity.this, "onActivityResult requestCode = " +code, Toast.LENGTH_SHORT).show();
                    }

                });



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btnStart=findViewById(R.id.startBtn);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_OPEN_DOCUMENT);
                //端末標準のギャラリーから取得
               intent.addCategory(Intent.CATEGORY_OPENABLE);
                // マイムタイプ
                intent.setType("image/jpeg");

                // ギャラリー起動
                Intent chooserIntent=Intent.createChooser(intent,getString(MainActivity.this,R.string.gallery_select)); // ギャラリーのタイトルが反映あされていませんが、原因は、後で調査します。

                chooserIntent.putExtra("recCode",GALLARY_INTENT_CALLED);

                activityResultLauncher.launch(chooserIntent);

            }
        });
    }
    public String getString(Context context, int resId) {
        return context.getResources().getString(resId);
    }
    /**
     * code(呼び出し元判別コード)を保持し、呼び出し元へ返却するクラス
     */
    class MyResultContract extends ActivityResultContract<Intent,ActivityResult> {

        private int callRequestCode;

        @NonNull
        @Override
         public Intent createIntent(@NonNull Context context, Intent input) {
            Intent intent=input;
           int code=intent.getIntExtra("request_code",0);
            callRequestCode=code;
            return intent;
        }


        @Override
        public ActivityResult parseResult(int resultCode, @Nullable Intent intent) {// intentは選択した画像のパスが入っている。
            if(resultCode==Activity.RESULT_OK){
               // 呼び出し元のリクエストコード
                Intent resIntent=intent;

                resIntent.putExtra("request_code",callRequestCode);
                ActivityResult activityResult=new ActivityResult(RESULT_OK,resIntent);

                return activityResult;

            }else{
                return null;
            }

        }

    }


}

10:56