質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5555閲覧

registerForActivityResultの使い方

hiro04kon

総合スコア46

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/05/30 04:24

Kotlinにてプログラムを勉強中の者です。

作っているもの

kotlinで、ファイラーからファイルを選択し、そのアドレスを取得する

解決したい点

記事を見ながらコードを書いていましたが、javaのコードをKotlinに直していたところ、
startActivityForResultは非推奨という注釈が出たので、直していました。
しかし、intentの渡し方の書き方がいまいち分かりません。

元のjavaコード

java

1package com.example.file_url 2 3import android.content.Intent; 4import android.location.GnssAntennaInfo; 5import android.os.Bundle; 6import android.view.View; 7import android.widget.Button; 8import android.widget.TextView; 9import androidx.appcompat.app.AppCompatActivity; 10import java.io.UnsupportedEncodingException; 11import java.net.URLDecoder; 12 13public class MainActivity extends AppCompatActivity { 14 private final static int CHOSE_FILE_CODE = 123; 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 //URLを読みだして渡す 21 final TextView text1 = (TextView)findViewById(R.id.imageText); 22 Button button_file = (Button)findViewById(R.id.button_file); 23 button_file.setOnClickListener(new View.OnClickListener() { 24 @Override 25 public void onClick(View v) { 26 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 27 intent.setType("*/*"); 28 startActivityForResult(intent, CHOSE_FILE_CODE); 29 } 30 }); 31 32 @Override 33 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 34 try { 35 if (requestCode == CHOSE_FILE_CODE && resultCode == RESULT_OK) { 36 TextView imageText = (TextView)findViewById(R.id.imageText); 37 String filePath = data.getDataString().replace("file://", ""); 38 String decodedfilePath = URLDecoder.decode(filePath, "utf-8"); 39 imageText.setText(decodedfilePath); 40 } 41 } catch (UnsupportedEncodingException e) { 42 // 例外処理 43 } 44 }

Kotlinに直して、startActivityForResultを使わないコード

MainActivity.kt

1package com.example.file_url 2 3import android.content.Intent 4import android.os.Bundle 5import android.view.View 6import android.widget.Button 7import android.widget.TextView 8import androidx.activity.result.ActivityResult 9import androidx.activity.result.ActivityResultCallback 10import androidx.activity.result.contract.ActivityResultContracts 11import androidx.appcompat.app.AppCompatActivity 12import java.io.UnsupportedEncodingException 13import java.net.URLDecoder 14 15class MainActivity : AppCompatActivity() { 16 private val CHOSE_FILE_CODE: Int = 12345 17 private val file_url = registerForActivityResult(ActivityResultContracts.StartActivityForResult(), ActivityResultCallbackUrl()) 18 19 override fun onCreate(savedInstanceState: Bundle?) { 20 super.onCreate(savedInstanceState) 21 setContentView(R.layout.activity_main) 22 23 //URLを読みだして渡す 24 val text1 = findViewById<View>(R.id.imageText) as TextView 25 val button_file = findViewById<View>(R.id.button_file) as Button 26 button_file.setOnClickListener { 27 val intent = Intent(Intent.ACTION_GET_CONTENT) 28 intent.type = "*/*" 29 file_url.launch(intent) 30 } 31 } 32 33***ここの受け取り方の記述が分かりません*** 34 private inner class ActivityResultCallbackUrl : ActivityResultCallback<ActivityResult> { 35 fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { 36 try { 37 if (requestCode == CHOSE_FILE_CODE && resultCode == RESULT_OK) { 38 val imageText = findViewById<View>(R.id.imageText) as TextView 39 val filePath = data.dataString!!.replace("file://", "") 40 val decodedfilePath = URLDecoder.decode(filePath, "utf-8") 41 imageText.text = decodedfilePath 42 } 43 } catch (e: UnsupportedEncodingException) { 44 // 例外処理 45 } 46 } 47 } 48}

無茶苦茶なコードだと思うのですが…
「//URLを読みだして渡す」をregisterForActivityResultの中に入れる、とか調べたらありましたが、よく分かりません。
お知恵を貸してください…。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試してませんが、たぶんこんな感じでは。
参考: ActivityResultContractを使ってonActivityResultに別れを告げよう - Qiita

Kotlin

1class MainActivity : AppCompatActivity() { 2 // コールバックを登録。呼び出すアクティビティごとに登録するため、CHOSE_FILE_CODE は不要。 3 private val fileLauncher = 4 registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> 5 // result は ActivityResult 型で、resultCode と data (Intent) を持つ。 6 if (result.resultCode == RESULT_OK) { 7 result.data?.dataString?.let { onFileResult(it) } 8 } 9 } 10 11 override fun onCreate(savedInstanceState: Bundle?) { 12 super.onCreate(savedInstanceState) 13 setContentView(R.layout.activity_main) 14 15 //URLを読みだして渡す 16 val text1 = findViewById<TextView>(R.id.imageText) 17 val button_file = findViewById<Button>(R.id.button_file) 18 button_file.setOnClickListener { 19 val intent = Intent(Intent.ACTION_GET_CONTENT) 20 intent.type = "*/*" 21 // Activity の呼び出しはこんな感じ。 22 fileLauncher.launch(intent) 23 } 24 } 25 26 // Activity 終了時の処理。上のコールバックの中に直接書いても良いが、メソッドを分けた方がすっきりする。 27 private fun onFileResult(dataString: String) { 28 try { 29 val imageText = findViewById<TextView>(R.id.imageText) 30 val filePath = dataString.replace("file://", "") 31 val decodedfilePath = URLDecoder.decode(filePath, "utf-8") 32 imageText.text = decodedfilePath 33 } catch (e: UnsupportedEncodingException) { 34 // 例外処理 35 } 36 } 37}

また、ActivityResultContracts は呼び出す Activity に特化したものがいくつか用意されていて、ACTION_GET_CONTENT の場合は次のようにも書けるみたいです。

Kotlin

1 private val fileLauncher = 2 registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> 3 // 引数は uri だけで、RESULT_OK じゃない場合は uri は null になる。 4 uri?.let { onFileResult(uri.toString()) } 5 } 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 // 略 9 button_file.setOnClickListener { 10 // 開きたいファイルの種類を指定するだけ。ただし、CATEGORY_OPENABLE が指定されるけど…。 11 fileLauncher.launch("*/*") 12 }

投稿2022/05/30 06:14

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro04kon

2022/05/30 06:46

ありがとうございます! 期待通りの動作をしました! 元のAndroid Developersを読んでみても、すでにあるものをどのように書いたらいいか、いつもつまずいてします…。 ご回答いただいたものを参考にしながら、勉強していきたいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問