web-dev-qa-db-fra.com

Comment définir mon application comme application par défaut SMS?

Je suis ce tutoriel sur la configuration de mon application par défaut SMS app, mais pour une raison quelconque, mon application n'apparaît pas dans la liste des options disponibles. J'ai a essayé de rechercher cela autant que possible, mais tout renvoie à ce même didacticiel ou est obsolète. Ai-je besoin d'un <receiver> ainsi que? Quelqu'un peut-il expliquer ce que je fais mal?

Le code:

@Override
protected void onResume()
{
    super.onResume();
    Log.i("MainAcitvity", "On Resume Called");
    // Only do these checks/changes on KitKat+, the "mSetDefaultSmsLayout" has its visibility
    // set to "gone" in the xml layout so it won't show at all on earlier Android versions.
    final String myPackageName = getPackageName();

    if (Utility.hasKitKat())
    {
        if (Utility.isDefaultSmsApp(this))
        {
            // This app is the default, remove the "make this app the default" layout and
            // enable message sending components.
            mSetDefaultSmsLayout.setVisibility(View.GONE);
        }
        else
        {
            Log.i("MainActivity", "Not Default App");
            // Not the default, show the "make this app the default" layout and disable
            // message sending components.
            mSetDefaultSmsLayout.setVisibility(View.VISIBLE);

            Button button = (Button) findViewById(R.id.set_default_sms_button);
            button.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View view)
                {                        
                    Log.i("MainActivity", "Button Pushed");
                    //Utility.setDefaultSmsApp(MainActivity.this);
                    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
                    startActivity(intent);
                }
            });
        }
    }
}

Le manifeste:

<activity
    Android:name=".MainActivity"
    Android:label="@string/app_name">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
        <action Android:name="Android.intent.action.SEND" />
        <action Android:name="Android.intent.action.SENDTO" />
        <category Android:name="Android.intent.category.DEFAULT" />
        <category Android:name="Android.intent.category.BROWSABLE" />
        <data Android:scheme="sms" />
        <data Android:scheme="smsto" />
        <data Android:scheme="mms" />
        <data Android:scheme="mmsto" />
    </intent-filter>
</activity>
18
Jayce

Pour que votre application soit éligible pour être sélectionnée comme application de messagerie par défaut (en ce qui concerne le système), vous devez répertorier tous les composants du manifeste comme indiqué dans ce billet de blog, si les classes de ces composants existent réellement ou pas.

<manifest>
    ...
    <application>
        <!-- BroadcastReceiver that listens for incoming SMS messages -->
        <receiver Android:name=".SmsReceiver"
            Android:permission="Android.permission.BROADCAST_SMS">
            <intent-filter>
                <action Android:name="Android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>

        <!-- BroadcastReceiver that listens for incoming MMS messages -->
        <receiver Android:name=".MmsReceiver"
            Android:permission="Android.permission.BROADCAST_WAP_Push">
            <intent-filter>
                <action Android:name="Android.provider.Telephony.WAP_Push_DELIVER" />
                <data Android:mimeType="application/vnd.wap.mms-message" />
            </intent-filter>
        </receiver>

        <!-- Activity that allows the user to send new SMS/MMS messages -->
        <activity Android:name=".ComposeSmsActivity" >
            <intent-filter>
                <action Android:name="Android.intent.action.SEND" />                
                <action Android:name="Android.intent.action.SENDTO" />
                <category Android:name="Android.intent.category.DEFAULT" />
                <category Android:name="Android.intent.category.BROWSABLE" />
                <data Android:scheme="sms" />
                <data Android:scheme="smsto" />
                <data Android:scheme="mms" />
                <data Android:scheme="mmsto" />
            </intent-filter>
        </activity>

        <!-- Service that delivers messages from the phone "quick response" -->
        <service Android:name=".HeadlessSmsSendService"
            Android:permission="Android.permission.SEND_RESPOND_VIA_MESSAGE"
            Android:exported="true" >
            <intent-filter>
                <action Android:name="Android.intent.action.RESPOND_VIA_MESSAGE" />
                <category Android:name="Android.intent.category.DEFAULT" />
                <data Android:scheme="sms" />
                <data Android:scheme="smsto" />
                <data Android:scheme="mms" />
                <data Android:scheme="mmsto" />
            </intent-filter>
        </service>
    </application>
</manifest>

Étant donné que le système inspecte uniquement le manifeste d'une application pour déterminer si elle peut agir comme application de messagerie par défaut, toutes les classes de ces composants ne doivent pas exister pour que votre application s'affiche dans la liste de sélection par défaut. Ceci est utile pour l'apprentissage et les tests, mais, évidemment, si votre application doit agir comme client de messagerie par défaut d'un utilisateur, elle doit implémenter entièrement tous les composants spécifiés.

Si vous avez l'intention d'effectuer des tâches liées aux SMS/MMS, vous aurez également besoin des autorisations appropriées. Bien que le système ne vérifie apparemment pas ces éléments lors de la détermination des candidats d'application par défaut éligibles, les autorisations suivantes sont nécessaires pour leurs opérations correspondantes:

<uses-permission Android:name="Android.permission.SEND_SMS" />
<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
<uses-permission Android:name="Android.permission.READ_SMS" />
<uses-permission Android:name="Android.permission.WRITE_SMS" />
<uses-permission Android:name="Android.permission.RECEIVE_MMS" />

Si vous manquez le SEND_SMS, READ_SMS, ou WRITE_SMS permission lorsque vous essayez d'exécuter l'action donnée, un SecurityException sera jeté. Cependant, si vous manquez un RECEIVE_* permission, votre application ne recevra tout simplement pas les diffusions pertinentes, et il peut sembler que rien ne se passe lors du test de ces fonctionnalités.

28
Mike M.