Wie lege ich meine App als Standard-SMS-App fest?

Lesezeit: 5 Minuten

Wie lege ich meine App als Standard SMS App fest
Jayce

Ich folge dieses Tutorial beim Festlegen meiner App als Standard-SMS-App, aber aus irgendeinem Grund wird meine App nicht in der Liste der verfügbaren Optionen angezeigt. Ich habe versucht, dies so gut wie möglich zu recherchieren, aber alles deutet auf dasselbe Tutorial zurück oder ist veraltet. Brauche ich eine <receiver> auch? Kann mir jemand erklären was ich falsch mache?

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

Das Manifest:

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

Wie lege ich meine App als Standard SMS App fest
Mike M.

Damit Ihre App als Standard-Messaging-App ausgewählt werden kann (was das System betrifft), muss ihr Manifest jede der vier Komponenten wie in diesem Blogbeitrag beschrieben auflisten, unabhängig davon, ob die Klassen dieser Komponenten tatsächlich vorhanden sind und funktional, oder nicht. Die Klassennamen können beliebige gültige Namen sein, aber der Rest jeder Komponente sollte ziemlich genau wie gezeigt sein:

<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:exported="true"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE">
            <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>

Da das System nur das Manifest einer App überprüft, um festzustellen, ob es als Standard-Messaging-App fungieren kann, benötigen Sie eigentlich keine dieser Klassen, obwohl Sie möglicherweise einige Warnungen/Fehler unterdrücken oder Stub-Klassen bereitstellen müssen, um Ihre IDE zufrieden.

Wenn Ihre App als Standard-Messaging-Client eines Benutzers fungieren soll, sollte sie natürlich alle angegebenen Komponenten vollständig implementieren. Allerdings kann eine unvollständige Implementierung durchaus sinnvoll sein; B. während des Lernens und Testens oder in Apps, die vorübergehend nur teilweisen Zugriff benötigen, wie Nachrichtensicherungs- und Wiederherstellungs-Apps.

Wenn Sie SMS/MMS-bezogene Aufgaben ausführen möchten, benötigen Sie auch die entsprechenden Berechtigungen. Obwohl das System diese anscheinend nicht prüft, wenn geeignete Standard-App-Kandidaten ermittelt werden, sind die folgenden Berechtigungen für die entsprechenden Vorgänge erforderlich:

<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" />

EIN SecurityException wird ausgelöst, wenn Ihnen die entsprechende Berechtigung für eine bestimmte Operation fehlt, obwohl einige leicht zu übersehen sind; zB wenn die RECEIVE_SMS Berechtigung fehlt, wenn das System versucht, eine eingehende SMS an einen im Manifest registrierten Empfänger zuzustellen. Achten Sie darauf, Ihre Protokolle zu überprüfen, wenn Sie unerwartetes Verhalten beobachten, auch wenn kein offensichtlicher Absturz vorliegt.

  • M: Ist „HeadlessSmsSendService“ eine Android-Dienstklasse?

    – Vineesh TP

    15. Juni 2017 um 5:33 Uhr

  • @VineeshTP Ja. Jede Komponente mit a <service> Element wäre a Service Unterklasse.

    – Mike M.

    15. Juni 2017 um 15:39 Uhr

  • @MikeM. Wenn ich nichts anderes tue, werden eingehende Nachrichten nie im Posteingang meiner normalen SMS-App angezeigt? als würden sie einfach verschwinden? Weil ich die SMS normalerweise in der Standard-App sehen möchte, aber meine App verwende, weil ich ein SMS-Gateway implementieren möchte.

    – GöttlicheLicht

    19. Oktober 2017 um 10:10 Uhr


  • @BlackDivine Ich bin mir nicht sicher, ob ich verstehe, was du fragst. Wenn Ihre App die Standard-Messaging-App ist, ist sie für das Speichern eingehender SMS verantwortlich. Wenn nicht, dann ja, verschwinden sie so ziemlich.

    – Mike M.

    19. Oktober 2017 um 19:23 Uhr

  • @alexsamsung Meinst du so? stackoverflow.com/q/42676866

    – Mike M.

    15. November 2018 um 15:15 Uhr

911040cookie-checkWie lege ich meine App als Standard-SMS-App fest?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy