首页 > 解决方案 > 使用 uri schme 和返回值的 Android 应用程序到应用程序

问题描述

在 Android 中,我试图通过虚拟应用程序的 uri 方案从我的应用程序中调用另一个虚拟应用程序。

从虚拟应用程序中,当用户单击按钮时,我想返回我的应用程序并返回值。

你认为有可能吗?

在 Dummy App 中,我进行如下配置:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />

    <data
                android:scheme="myapp"
                android:host="my-poc-application.com"
                android:pathPrefix="/id" />
</intent-filter>

从我的应用程序中,我尝试重新定向到我的虚拟应用程序:

字符串方案 = "myapp";
字符串主机 = "my-poc-application.com";
字符串 id = "8";
uri uri = Uri.parse(scheme + "://" + host + "/" + id);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

// 验证它是否解析
PackageManager packageManager = getPackageManager();
列出活动 = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activity.size() > 0;

// 如果它是安全的,则启动一个活动
如果(isIntentSafe){
   startActivityForResult(intent, 1);
}

但是没有调用虚拟应用程序。

标签: android

解决方案


这是我的尝试:

在目标应用的活动中注册意图过滤器:

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data
                    android:scheme="target-app"
                    android:host="target-app.com" />
            </intent-filter>

        </activity>

注意:您不需要 pathPrefix

在目标应用程序的主要活动中:

btnGoBack.setOnClickListener{
            val resultIntent = Intent()
            resultIntent.putExtra("Result", "I am the result from target app")
            setResult(1000, resultIntent)
            finish()
        }

//Read the id you sent while calling this app
            val uri = intent.data
            Toast.makeText(this, uri?.path.toString(), Toast.LENGTH_SHORT).show()

注意: uri?.path 将包含您传递的 /id ,在您的示例中为 8

现在,在父应用程序中,您将从那里调用此目标应用程序:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnOpen.setOnClickListener{
            val scheme = "target-app"
            val host = "target-app.com"
            val id = "8"
            val uri = Uri.parse("$scheme://$host/$id")
            val intent = Intent(Intent.ACTION_VIEW, uri)

            // Verify it resolves
            val activities = packageManager.queryIntentActivities(intent, 0)
            val isIntentSafe = activities.size > 0

            // Start an activity if it's safe
            if (isIntentSafe) {
                startActivityForResult(intent, 1)
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == 1000){
            Toast.makeText(this, data?.getStringExtra("Result"), Toast.LENGTH_SHORT).show()
        }
    }

该活动有一个名为 的按钮btnOpen

在 中onActivityResult,我们得到了我们从目标应用程序发送的结果。

此代码在 kotlin 中,将其转换为 java 应该很简单。

如果您有任何其他问题,请务必告诉。

问候,

普里亚布拉塔


推荐阅读