4
votes

Android: comment créer une application de numérotation par défaut?

Aujourd'hui, j'ai reçu un rejet de Google pour mon application Facetocall

  • Votre application ne semble pas inviter l'utilisateur à être un gestionnaire par défaut avant de demander les autorisations associées comme l'exige la stratégie. Veuillez apporter les modifications nécessaires afin de vous conformer à la politique exigences et renvoyez votre application via un formulaire de déclaration.

  • La fonctionnalité de gestionnaire par défaut a été répertoriée sur votre formulaire de déclaration, mais votre application n'a pas de capacité de gestionnaire par défaut.

Mon objectif est de créer une application de numérotation par défaut.

Voici mon manifeste

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

Et voici ce que je fais quand mon application se lance:

<?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>

Que me manque-t-il ici?

J'ai réessayé de soumettre le formulaire et cette fois j'ajoute un vidéo qui montre mon application sur un émulateur (je vois le même comportement sur tous les appareils réels aussi) voici la réponse que j'ai récupéré:

  • Votre application ne semble pas inviter l'utilisateur à être un gestionnaire par défaut avant de demander les autorisations associées comme requis par la stratégie. Veuillez apporter les modifications nécessaires afin de vous conformer à la politique exigences et renvoyez votre application via un formulaire de déclaration.


9 commentaires

Google a récemment annoncé qu'une application ne devrait pas demander l'autorisation SMS ou l'autorisation du journal des appels s'il ne s'agit pas d'une application SMS ou APPEL par défaut. Il l'a fait pour des raisons de sécurité. Trouvez un lien vers l'article ici support.google.com/googleplay/android-developer / answer / 90473‌ 03 . À mon avis, parce que vous voulez vous comporter comme une application d'appel par défaut et utiliser les autorisations sensibles ci-dessus, vous devez dire à l'utilisateur pourquoi vous avez besoin de ces autorisations et pourquoi il devrait vous autoriser à l'aide du dialogue avant de lancer le < code> startActivityForResult (intent, REQUEST_CODE_SET_DEFAULT_DIALER) .


@AbhishekMadan au lien que vous m'avez envoyé, cliquez sur: Utilisations autorisées des autorisations SMS et du journal des appels, cela montrera mon cas d'utilisation.


Si vous pensez que votre application répond aux exigences du règlement pour une utilisation acceptable ou qu'elle est éligible à une exception, envoyez un formulaire de déclaration d'autorisation dès que possible pour que Google Play l'examine. Vous serez averti si votre demande a été approuvée. Vous n'avez pas besoin d'avoir mis en œuvre les modifications de l'APK pour envoyer le formulaire de déclaration. . Donc, je pense que vous devez simplement soumettre le formulaire de déclaration comme on dit.


Oui je l'ai fait et j'ai eu un rejet comme mentionné dans la question


Ce qu'ils disent, c'est que votre application doit être le gestionnaire par défaut avant de demander et d'utiliser les autorisations. Le point est ce que l'application fait avant d'appeler isAlreadyDefaultDialer () . Demandez-vous ou utilisez-vous les autorisations avant d'être le gestionnaire par défaut?


@EasyJoinDev Non, je ne le fais pas. Regardez la vidéo ou téléchargez mon application et vous verrez par vous-même.


@IlyaGazman Alors ils ont tort. Nous parlons de la nouvelle procédure de reddit, rejoignez-nous redd.it/ak68l2


@IlyaGazman pouvez-vous partager quelques conseils sur la façon de passer l'examen? J'ai déjà essayé de nombreuses soumissions avec toutes les descriptions mais toujours sans succès :(


Avez-vous trouvé une solution?


3 Réponses :


0
votes

Vous n'avez pas besoin de paniquer. Ce type de conversation a également eu lieu avec moi, concernant le contenu AdMob de mon application. J'ai tout déclaré parfaitement, mais ils disaient toujours que la classification du contenu n'était pas correcte en raison du type d'annonces que mon application diffusait. Lorsque plus de mails échangés, ils m'ont envoyé une capture d'écran avec la preuve de mauvaises publicités, alors j'ai finalement vérifié à nouveau tout mon code et j'ai trouvé mon erreur.

Le fait est que Google est doué dans ce qu'il fait, et s'ils le disent, alors votre application manque de quelque chose.

Pour être très honnête, votre application a fait ne demandez nulle part à l'utilisateur de l'autoriser à être défini par défaut, mais il se définit par défaut en arrière-plan. Vous devez demander toutes les autorisations requises par votre application qui sont essentielles et peuvent être utilisées par n'importe quelle application, virus ou logiciel espion pour interférer avec la confidentialité des utilisateurs .

Vous pouvez le faire avec une fonction comme dans l'exemple suivant, qui demande l'autorisation de l'appareil photo à l'utilisateur:

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

Vous pouvez voir le référentiel complet sur Google Samples

Et ne vous inquiétez pas. Si vous corrigez ce problème, ils accepteront votre candidature, comme ils l'ont fait pour la mienne.


3 commentaires

"Pour être très honnête, vos applications n'ont demandé à aucun utilisateur de l'autoriser à être défini par défaut" Comment avez-vous enrichi cette conclusion? Pourquoi dites-vous des applications alors qu'il n'y a qu'une seule application dont je parle? Et dans quelle mesure l'autorisation de la caméra est-elle pertinente pour la nouvelle politique?


Eh bien, le code que vous publiez ne contenait aucune requête de l'utilisateur final, c'est pourquoi. Il devrait être dans votre fonction checkdefaulthandler avant de commencer toute intention


Le fait est que Google est bon dans ce qu'il fait, et s'ils le disent, alors votre application manque de quelque chose. enfin pas toujours ;-)



-1
votes

au cas où quelqu'un viendrait traverser ce message. . . J'ai utilisé ceci pour demander à l'utilisateur de changer le dailer par défaut. Sachez qu'il va y avoir 2 fenêtres d'invite (pour moi c'était bien).

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

}


0 commentaires

1
votes

pour créer une application de numérotation par défaut, vous devez faire 2 choses:

1. ajoutez les autorisations suivantes dans votre manifeste Android

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

}
  1. en train d'effectuer la vérification:
<activity>
    <intent-filter>
        <action android:name="android.intent.action.DIAL"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>


1 commentaires

Pouvez-vous me dire exactement ce que vous avez fait?