在 Kotlin Jetpack Compose 中单击按钮后启动另一个 Android 应用程序

问题描述 投票:0回答:1

我是 Android 开发新手。我想问一个问题,一旦我单击按钮,此代码即可打开设置应用程序。我想对我手机中安装的以下演示应用程序 https://github.com/Picovoice/porcupine/tree/master/demo/android/Activity 进行同样的操作。为什么打不开?我需要在清单文件中添加一些内容吗?提前非常感谢。

此代码适用于包名称“com.android.settings”,但不适用于“com.android.youtube”

package com.example.jkfdsjlk

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.example.jkfdsjlk.ui.theme.JkfdsjlkTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            JkfdsjlkTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    MyApp(
                        modifier = Modifier.padding(innerPadding)
                    )
                }
            }
        }
    }
}

@Composable
fun OpenAppButton() {
    val context = LocalContext.current

    // Create a launcher for activity result
    val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartActivityForResult()
    ) { }

    Button(
        onClick = {
            // Intent to open another app
            val intent = context.packageManager.getLaunchIntentForPackage("ai.picovoice.porcupine.demo")

            // Check if the intent is not null and launch the app
            intent?.let {
                launcher.launch(intent)
            }
        },
        modifier = Modifier
            .padding(16.dp)
            .fillMaxWidth(),
        content = {
            Text(text = "Open Another App")
        }
    )
}

@Composable
fun MyApp(modifier: Modifier) {
    Surface(color = MaterialTheme.colorScheme.background) {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(16.dp),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            OpenAppButton()
        }
    }
}
android kotlin android-jetpack-compose manifest jetpack
1个回答
0
投票

如果您在

PackageManager
上调用方法(如
getLaunchIntentForPackage()
),则需要考虑在清单中可能需要进行哪些更改,以符合 Android 11 及更高版本上的 包可见性规则

在您的情况下,声明您的特定包名称应该有效:

<queries>
    <package android:name="ai.picovoice.porcupine.demo" />
</queries>
© www.soinside.com 2019 - 2024. All rights reserved.