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