android - 使用 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); }
但是没有调用虚拟应用程序。
解决方案
这是我的尝试:
在目标应用的活动中注册意图过滤器:
<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 应该很简单。
如果您有任何其他问题,请务必告诉。
问候,
普里亚布拉塔
推荐阅读
- postgresql - 如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?
- python - 在python中裁剪一个体积(二维切片堆栈)
- excel - 我有一个 .txt 文件,当我将其保存为 csv 时,前导 0 不再存在
- wpf - GMap.NET WPF 标记计时器更新
- c# - AWS S3 如何将文件从存储桶移动到不同区域的另一个存储桶
- python - 为每次获取更改用户代理字符串
- html - 引导列表组不互锁
- powershell - 如何使用 powershell 拦截命令输出的指定字符串?
- html - Angular 应用程序无法全屏显示
- javascript - 列表项在进入 HTML+JavaScript 待办事项列表后立即被清除