あなたのAndroidアプリケーションからGoogle翻訳を開く


このポストでは、プログラムを開いてGoogle翻訳を別のAndroidアプリケーションから翻訳し、テキストを翻訳する方法を示します.
例として、いくつかのテキストを表示し、「翻訳」ボタンを提供するスクリーンを使用します.

ソースコードは以下の通りです.
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TranslateTestTheme {
                MainScreen(
                    title = "Dog",
                    body = dogDescription,
                    onTranslateClick = { openGoogleTranslate(dogDescription) },
                )
            }
        }
    }
}

@Composable
private fun MainScreen(
    title: String,
    body: String,
    onTranslateClick: () -> Unit,
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = title) },
                actions = {
                    IconButton(onClick = onTranslateClick) {
                        Icon(Icons.Default.GTranslate, contentDescription = "Translate")
                    }
                }
            )
        },
        content = {
            Text(
                text = body,
                style = MaterialTheme.typography.body2,
                modifier = Modifier.padding(16.dp),
            )
        },
    )
}
キー部分はコールバックに対応しています.
onTranslateClick = { openGoogleTranslate(dogDescription) }でGoogle翻訳を起動するIntent.ACTION_PROCESS_TEXTの方法を見てみましょう.
fun Context.openGoogleTranslate(text: String) {
    val intent = Intent()
        .setAction(Intent.ACTION_PROCESS_TEXT)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_PROCESS_TEXT, text)
        .putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, true)
    startActivity(intent)
}
openGoogleTranslateの意図的なフィルタに登録されているActivityを開きます.Google翻訳アプリはそのようなIntent.ACTION_PROCESS_TEXTを提供するように、それは言及されたメソッドが呼ばれるときに開かれる候補の一つです.
しかし、一部のユーザーがGoogle翻訳アプリケーションがインストールされていないことを覚えておくことが重要です.一部のユーザーはまた、そのデバイスにActivityを処理するアプリケーションを持っています.
番目のケースでは、Androidは次のダイアログを求めます

インストールされた意図を処理するアプリケーションがない場合、Intent.ACTION_PROCESS_TEXTの呼び出しでActivityNotFoundExceptionがスローされます.このケースはstartActivityブロックで扱うことができます.
try {
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // TODO: Show error
}

Google翻訳がチェックされるならば、チェックしてください
Google翻訳がインストールされている場合にのみ、“翻訳”ボタンを表示するのもいいでしょう.次のコードを使用して、その存在を確認できます.
fun Context.queryProcessTextActivities(): List<ResolveInfo> {
    val intent = Intent()
        .setAction(Intent.ACTION_PROCESS_TEXT)
        .setType("text/plain")
    return packageManager.queryIntentActivities(intent, 0)
}

fun Context.isGoogleTranslateInstalled() = queryProcessTextActivities()
    .any { it.activityInfo.packageName == "com.google.android.apps.translate" }
すべてのAndroidバージョンでtry/catchを正しく動作させるには、次のフラグメントをqueryIntentActivitiesに追加します.
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <application ...>
        ...
    </application>
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <data android:mimeType="text/plain" />
        </intent>
    </queries>
</manifest>

直接起動
我々はまた、-もしそれがインストールされている- Google翻訳は、関係なく、または意図して処理する他のアプリケーションがある場合は関係なく起動されます.
そのためには、次のコードを使用できます.
fun Context.queryProcessTextActivities(): List<ResolveInfo> {
    val intent = Intent()
        .setAction(Intent.ACTION_PROCESS_TEXT)
        .setType("text/plain")
    return packageManager.queryIntentActivities(intent, 0)
}

fun Context.googleTranslateActivityInfo() = queryProcessTextActivities()
    .firstOrNull { it.activityInfo.packageName == "com.google.android.apps.translate" }
    ?.activityInfo

fun Context.openGoogleTranslate(activity: ActivityInfo, text: String) {
    val intent = Intent()
        .setAction(Intent.ACTION_PROCESS_TEXT)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_PROCESS_TEXT, text)
        .putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, true)
        // Following line makes sure only Google Translate app will be launched
        .setClassName(activity.packageName, activity.name)
    try {
        startActivity(intent)
    } catch (e: ActivityNotFoundException) {
        // TODO: Show error
    }
}
このリンクの下に完全なKollinのコードを見つけることができます