Android:如何制作默认拨号器应用程序?

2024-02-26

今天我的应用遭到 Google 拒绝面对面通话 https://play.google.com/store/apps/details?id=com.gazman.beep

  • 在按照策略要求请求相关权限之前,您的应用程序似乎不会提示用户成为默认处理程序。 请进行必要的更改以遵守政策 要求并通过声明表重新提交您的应用程序。

  • 您的声明表单上列出了默认处理程序功能,但您的应用程序没有默认处理程序功能。

我的目标是制作一个默认的拨号器应用程序。

这是我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.gazman.beep"
    android:installLocation="preferExternal">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    ... and other permissions

    <application
        android:name=".application.BeepApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        tools:ignore="GoogleAppIndexingWarning">

        <activity
            android:name=".system_intents.IntentsActivity"
            android:launchMode="singleTask"
            android:noHistory="true"
            android:theme="@style/Theme.Transparent">
            <intent-filter>
                <action android:name="android.intent.action.DIAL" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.DIAL" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="tel" />
            </intent-filter>
        </activity>

        <activity
            android:name=".call.CallActivity"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:showForAllUsers="true" />

        <service
            android:name="com.gazman.beep.call.MyInCallService"
            android:permission="android.permission.BIND_INCALL_SERVICE">
            <meta-data
                android:name="android.telecom.IN_CALL_SERVICE_UI"
                android:value="true" />
            <intent-filter>
                <action android:name="android.telecom.InCallService" />
            </intent-filter>
        </service>

        ... And other declarations

    </application>

</manifest>

这是我的应用程序启动时所做的事情:

private void checkDefaultHandler() {
    if (isAlreadyDefaultDialer()) {
        return;
    }
    Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
    intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER);
    }
    else{
        throw new RuntimeException("Default phone functionality not found");
    }
}

private boolean isAlreadyDefaultDialer() {
    TelecomManager telecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);
    return getPackageName().equals(telecomManager.getDefaultDialerPackage());
}

我在这里缺少什么?

我尝试再次提交表单,这次我添加了一个video https://www.youtube.com/watch?v=V5ydUm9KdtI这在模拟器上显示了我的应用程序(我也在所有真实设备上看到了相同的行为)这是我得到的答复:

  • 在按照策略要求请求相关权限之前,您的应用程序似乎不会提示用户成为默认处理程序。 请进行必要的更改以遵守政策 要求并通过声明表重新提交您的应用程序。

要制作默认拨号器应用程序,您需要做两件事:

1. 在你的android清单中添加以下权限

<activity>
    <intent-filter>
        <action android:name="android.intent.action.DIAL"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
  1. 实际执行检查:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_layout)
    ...
    checkDefaultDialer()
    ...
}
const val REQUEST_CODE_SET_DEFAULT_DIALER=200

private fun checkDefaultDialer() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
        return

    val telecomManager = getSystemService(TELECOM_SERVICE) as TelecomManager
    val isAlreadyDefaultDialer = packageName == telecomManager.defaultDialerPackage
    if (isAlreadyDefaultDialer)
        return
    val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
                .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
    startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when (requestCode) {
        REQUEST_CODE_SET_DEFAULT_DIALER -> checkSetDefaultDialerResult(resultCode)
    }
}

private fun checkSetDefaultDialerResult(resultCode: Int) {
    val message = when (resultCode) {
        RESULT_OK       -> "User accepted request to become default dialer"
        RESULT_CANCELED -> "User declined request to become default dialer"
        else            -> "Unexpected result code $resultCode"
    }

    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:如何制作默认拨号器应用程序? 的相关文章

随机推荐

  • BlackBerry SQLite 数据库创建:“文件系统未就绪”

    我的应用程序从服务器获取数据并将其保存到 SQLite 数据库中 这在 9550 中工作得很好 黑莓风暴2 http en wikipedia org wiki BlackBerry Storm 2 模拟器 但是当我在任何其他模拟器中运行它
  • 如何解决“java.lang.OutOfMemoryError:超出GC开销限制”

    I read 这个堆栈溢出页面 https stackoverflow com questions 1393486 what does the error message java lang outofmemoryerror gc over
  • 将自定义 WSDL 绑定到现有 WCF 服务

    我使用 WCF 创建了一个 Web 服务 我不知道如何通过数据契约在 WSDL XSD 中设置约束和限制 如果我使用约束改进 XSD2 架构 然后将此自定义架构绑定到现有服务会怎样 如果是这样 我怎样才能使服务公开改进的 WSDL 否则 还
  • R按组计数元素的出现次数[重复]

    这个问题在这里已经有答案了 计算每个组中向量或数据帧上元素出现次数的最简单方法是什么 我的意思并不是只计算总数 正如其他 stackoverflow 问题所要求的那样 而是为每个连续发生的事件提供不同的数字 例如对于这个简单的数据框 但我将
  • jQuery Sortable - 拖放多个项目

    我有以下代码 它允许用户从一个列表拖放到另一个列表 现在 我如何允许用户选择并拖放多个项目 像这样的东西吗 http jsfiddle net T68Fn http jsfiddle net T68Fn 我尝试将 jsfiddle 中的代码
  • 用于 ASP.NET Core 应用程序生产的 Kestrel 准备好了吗?

    我有一个在 asp net core 2 0 中开发的角度应用程序使用的 api 它已部署在 IIS 中并配置为使用 kestrel 我读到 Kestrel 在公开公开应用程序时并不安全等等 真的吗 Kestrel 还没有准备好用于生产吗
  • C++ 正则表达式解析嵌套结构

    我有一个永久格式如下的字符串 First nested string Second nested string 嵌套可以是任意深度 每个子元素都采用右大括号的格式 在上一层嵌套和右大括号的基础上添加两个空格 我想接收允许获取嵌套数据的正则表
  • 使用 WebCrypto API 生成 RSA 密钥对并使用密码保护它

    标题说明了一切 我想知道如何使用 WebCrypto API 生成 RSA 密钥对 以及如何使用密码保护它 以便将其存储在数据库中 You can 使用 WebCrypto 生成 RSA 密钥对并将其导出如 jwk Json Web 密钥
  • Spark 中的类型安全配置

    我已经在 Spark 应用程序中定义了一个默认配置 该配置位于src main resources reference conf I use ConfigFactory load 来获取配置 当我运行应用程序时spark submit它采用
  • 双Python for循环的numpy向量化

    V 是 n p numpy 数组 通常维度为 n 10 p 20000 我现在的代码看起来像 A np zeros p for i in xrange n for j in xrange i 1 A F i j V i V j 我将如何重写
  • Xpath 选择祖先

    我试图找到一个公式 根据元素在 XML 层次结构中的位置为该元素创建 URL 这是我的示例 xml
  • HttpContent 边界双引号

    我有这个代码示例 它是作为另一个问题的答案发布的 使用 C 通过 HTTP POST 发送文件 https stackoverflow com questions 1131425 send a file via http post with
  • 如何使用jquery查找表中行的索引

    我正在尝试查找表中一行的索引 我正在尝试使用以下代码 但我似乎得到的索引为 1 document ready function tr click function var index table index this span text T
  • 在 Javascript 中将 GMT 日期/时间转换为 EST

    在 Javascript 中 无论用户设置如何 如何将 GMT 中的日期 时间转换为 EST var tmpDate New Date enter any valid Date format here JavaScriptDate http
  • 如何证明一个函数有效?

    我最近开始信奉测试 并主要从单元测试开始 我编写单元测试来说明函数在某些情况下工作 特别是使用我正在使用的确切输入 我可能会做一些单元测试来练习该功能 不过 除了该函数在我测试过的场景下达到了我预期的效果之外 我实际上还没有证明任何其他东西
  • 从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?

    我已将 VS2010 中当前针对 NET 4 0 的解决方案迁移到 VS2012 现在我想将其重新定位到 Net 4 5 我不确定的是 NuGet 包 例如 我在 VS2010 中从 EF4 更新的 EF5 实际上是 EF 4 4 如下所示
  • Redirect 和 RewriteRule 一起使用时的 .htaccess 重定向循环

    我正在 HTACCESS 文件中尝试以下操作 我想要 301 重定向 gt http www domain com somepage php page foo http www domain com somepage php page fo
  • Google App脚本更新另一张工作表中的单元格值

    我对这个有点卡住了 我试图在更新另一个电子表格的第一列后找到相应的行并更新另一个谷歌电子表格中的最后一列 当用户在电子表格 X 的 ColA 中选择 重新进货 时 我需要在另一张工作表 Y 上的 ColB 中查找 ID 值 然后我需要访问电
  • 如何获取 websocket 端点内的 cookie 值

    我在我的应用程序中使用基于 JavaEE 7 的 Websocket API 我需要访问 websocket 端点内 cookie 中设置的值 Annotated one ServerEndpoint websocket 我该怎么做呢 on
  • Android:如何制作默认拨号器应用程序?

    今天我的应用遭到 Google 拒绝面对面通话 https play google com store apps details id com gazman beep 在按照策略要求请求相关权限之前 您的应用程序似乎不会提示用户成为默认处理