【问题标题】:Android: How to make a default dialer app?Android:如何制作默认拨号器应用程序?
【发布时间】:2019-01-14 23:50:33
【问题描述】:

今天我的应用 Facetocall 被 Google 拒绝了

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

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

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

这是我的清单

<?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,它在模拟器上显示了我的应用程序(我在所有真实设备上也看到了相同的行为)这是我得到的回复:

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

【问题讨论】:

  • Google 最近宣布,如果应用程序不是默认的 SMS 或 CALL 应用程序,则不应请求 SMS 权限或通话记录权限。出于安全原因,它这样做了。在这里找到文章链接support.google.com/googleplay/android-developer/answer/9047303。在我看来,因为您想充当默认呼叫应用程序并使用上述敏感权限,所以您必须告诉用户您为什么需要这些权限以及为什么他应该在对话的帮助下允许您在继续触发 @ 987654326@.
  • @AbhishekMadan 在您发送给我的链接上,单击:短信和通话记录权限的允许使用,它将显示我的用例。
  • If you believe your app meets the policy requirements for acceptable use or is eligible for an exception, submit a Permissions Declaration Form as soon as possible for Google Play to review. You will be notified if your request has been approved. You do not need to have implemented APK changes in order to submit the Declaration Form.。所以,我相信你只需要按照他们说的提交申报表。
  • 是的,我做到了,但我收到了问题中提到的拒绝
  • 他们说的是您的应用程序应该是默认处理程序,然后才能询问和使用权限。关键是应用程序在调用isAlreadyDefaultDialer() 之前所做的事情。在成为默认处理程序之前,您是否要求或使用权限?

标签: android android-dialer


【解决方案1】:

您不必惊慌。这种对话也发生在我身上,关于我应用中的 AdMob 内容。我完美地宣布了所有内容,但由于我的应用显示的广告类型,他们仍然说内容分级不好。当更多邮件交换时,他们向我发送了带有错误广告证明的屏幕截图,所以最后我再次检查了我的整个代码并发现了我的错误。

这里的重点是 Google 擅长他们所做的事情,如果他们这么说,那么您的应用就缺少一些东西。

老实说,您的应用并没有在任何地方要求用户允许将其设置为默认值,而是在后台将自己设置为默认值。 您应该请求您的应用所需的所有关键权限,并且任何应用或病毒或间谍软件都可以使用这些权限来干扰用户隐私

您可以使用以下示例中的函数来执行此操作,该函数要求用户授予相机权限:

private void requestCameraPermission() {
        Log.i(TAG, "CAMERA permission has NOT been granted. Requesting permission.");

        // BEGIN_INCLUDE(camera_permission_request)
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            Log.i(TAG,
                    "Displaying camera permission rationale to provide additional context.");
            Snackbar.make(mLayout, R.string.permission_camera_rationale,
                    Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.ok, new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    REQUEST_CAMERA);
                        }
                    })
                    .show();
        } else {

            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    REQUEST_CAMERA);
        }
        // END_INCLUDE(camera_permission_request)
    }

你可以看到complete repository at Google Samples

别担心。如果你纠正了这个问题,他们就会接受你的申请,就像他们接受我的申请一样。

【讨论】:

  • “老实说,您的应用程序没有要求任何地方的用户允许将其设置为默认值”您是如何丰富这个结论的?为什么你说应用程序,而我只讨论一个应用程序? cam 权限与新政策有何关联?
  • 好吧,您发布的代码没有来自最终用户的任何查询,这就是原因。在开始任何意图之前,它应该在您的 checkdefaulthandler 函数中
  • The point here is that Google is good at what they do, and if they said so, then your app lacks something. 并非总是如此;-)
【解决方案2】:

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

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

<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()

}

【讨论】:

  • 你能告诉我你做了什么吗?
【解决方案3】:

以防万一有人看到这篇文章。 . . 我用它来询问用户更改默认拨号器。 知道会有 2 个窗口提示(对我来说很好)。

   private void setDefaultDialer()


 {
    AlertDialog.Builder builder;
    builder = new AlertDialog.Builder(this);
    builder.setMessage("Do you want to make Cricket your default Dialer?(it will not cover or replace your dialer)")
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    defaultDialerPackage = "cricket";
                    Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
                    startActivityForResult(intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,getPackageName()),REQUEST_CODE_SET_DEFAULT_DIALER);
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                    Toast.makeText(getApplicationContext(),"Cancelled - No action was taken",
                            Toast.LENGTH_SHORT).show();
                }
            });

AlertDialog alert = builder.create();
alert.setTitle("Cricket need default dialer permission!!");
alert.show();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多