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

Ily*_*man 5 android android-dialer

今天我的应用Facetocall 被谷歌拒绝了

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

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

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

这是我的清单

<?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>
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序启动时的操作:

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());
}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

我再次尝试提交表单,这次我添加了一个视频,在模拟器上显示我的应用程序(我在所有真实设备上也看到了相同的行为)这是我得到的回复:

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

Van*_*aga 0

你不需要惊慌。我也发生过这样的对话,内容涉及我的应用程序上的 AdMob 内容。我完美地声明了一切,但他们仍然说由于我的应用程序显示的广告类型,内容评级不好。当更多的邮件交换时,他们向我发送了带有错误广告证明的屏幕截图,所以最后我再次检查了我的整个代码并发现了我的错误。

这里的要点是,谷歌擅长他们所做的事情,如果他们这么说,那么你的应用程序就缺少一些东西。

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

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

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)
    }
Run Code Online (Sandbox Code Playgroud)

您可以在 Google Samples 中查看完整的存储库

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