android sms default telephony

android - ¿Cómo configuro mi aplicación como la aplicación de SMS predeterminada?



default telephony (1)

Estoy siguiendo este tutorial sobre cómo configurar mi aplicación como la aplicación de SMS predeterminada, pero por alguna razón, mi aplicación no aparece en la lista de opciones disponibles. He intentado investigar esto lo más posible, pero todo apunta a ese mismo tutorial o está desactualizado. ¿Necesito también un <receiver> ? ¿Alguien puede explicar lo que estoy haciendo mal?

El código:

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

El manifiesto:

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


Para que su aplicación sea elegible para ser seleccionada como la aplicación de mensajería predeterminada (en lo que respecta al sistema), debe enumerar todos los componentes en el manifiesto como se muestra en esa publicación de blog, si las clases de esos componentes realmente existen o no.

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

Dado que el sistema solo inspecciona el manifiesto de una aplicación para determinar si puede actuar como la aplicación de mensajería predeterminada, no todas las clases de esos componentes deben existir para que su aplicación se muestre en la lista de selección predeterminada. Esto es útil para aprender y probar, pero, obviamente, si su aplicación debe actuar como cliente de mensajería predeterminado del usuario, debe implementar completamente todos los componentes especificados.

Si tiene la intención de realizar cualquier tarea relacionada con SMS / MMS, también necesitará los permisos pertinentes. Aunque el sistema aparentemente no verifica esto al determinar los candidatos elegibles para la aplicación predeterminada, los siguientes permisos son necesarios para sus operaciones correspondientes:

<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 no tiene el SEND_SMS , READ_SMS o WRITE_SMS cuando intenta realizar la acción dada, se lanzará una SecurityException . Sin embargo, si le falta un permiso RECEIVE_* , su aplicación simplemente no recibirá las transmisiones pertinentes, y puede parecer que no sucede nada al probar esas funcionalidades.