android - Android 11 (API 30) 如何从我的应用程序启动默认计算器?
问题描述
我需要启动默认的 android 计算器应用程序。我在这个论坛上发现了类似的问题,但它并没有解决我的问题。 如何在我的应用程序上为所有手机调用 Android 计算器
这段代码似乎适用于旧版本的 android OS。但不适用于 android 11(可能是导致https://developer.android.com/about/versions/11/privacy/package-visibility的原因)。所以我尝试在清单中添加
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
它也不起作用。我怎么解决这个问题?
谢谢。
解决方案
该makeMainSelectorActivity()
方法是正确的,但我们可以尝试直接的方法作为后备:
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
startActivity(
Intent.makeMainSelectorActivity(
Intent.ACTION_MAIN,
Intent.CATEGORY_APP_CALCULATOR
)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
} catch (t: Throwable) {
try {
startActivity(
Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_APP_CALCULATOR)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
} catch (t: Throwable) {
Toast.makeText(
this,
"Sorry, I cannot find a calculator",
Toast.LENGTH_LONG
).show()
}
}
}
}
Toast
如果您无法通过任何一种方式找到计算器应用程序,则会将其替换为您想要的任何错误状态。以下是各种测试设备上的结果:
Pixel 4/Android 11:启动股票计算器应用程序
三星 Galaxy S8/Android 10:,
Toast
因为三星开发者没有宣传他们的计算器应用程序是计算器应用程序,所以像你这样的第三方应用程序无法识别它诺基亚 7.1/Android 10:推出股票计算器应用程序
LG V20/Android 8:启动股票计算器应用程序
Pixel 3XL/Android 12 Beta:推出股票计算器应用程序
三星 Galaxy A50/Android 11:
Toast
可能与 Galaxy S8 的原因相同
Intent
当然欢迎您为特定的计算器应用程序(例如三星的应用程序)尝试一些对象,以期提高您的匹配率。不过最终:
- 制造商不必包含计算器应用程序
- 当前用户可能无权访问计算器应用程序(例如,受限个人资料)
- 作为计算器的应用程序可能不会通过 将自己宣传为计算器应用程序
CATEGORY_APP_CALCULATOR
,在这种情况下,无法保证确定该应用程序是计算器应用程序
因此,您需要满足许多(但不是全部)用户能够启动计算器应用程序的条件。
推荐阅读
- kubernetes - Terraform 脚本在创建新命名空间之前破坏先前创建的 kubernetes 命名空间
- bash - Saltstack cloud.map 与 Bash 变量
- python - 无法在 Odoo 13 中安装自己的自定义模块
- c++ - 有提议吗?C++ 的运算符/空条件运算符?
- python - 具有优先级的数据帧的模式
- python - 如何使用 uvicorn 创建的事件循环?
- python - django 模型将 OneToOneField 更改为 ForeignKey 而没有停机时间
- kentico - Kentico 覆盖机器人元标记
- sap-fiori - 在 CAP 中显示与 SAP Fiori 注释的“一对多”关联
- r - 截距 = F 时 glmnet 的不同结果