Android默认使默认的短信应用程序

所以我按照这个教程在这里设置我的短信默认,但由于某种原因,我的代码不起作用。 我试图尽可能多地看这个,但是所有的东西都指向这个教程,或者已经过时了。 我还需要接收器吗? 有人可以解释我做错了什么?

代码:

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

清单:

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

为了使您的应用程序有资格被选为默认消息应用程序(就系统而言),您必须列出该博客文章中显示的清单中的所有组件,这些组件的类是否实际存在或不。

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

由于系统只检查应用程序的清单以确定它是否可以作为默认消息应用程序,因此您的应用程序不能在默认select列表中显示所有这些组件的类。 这对学习和testing非常有用,但显然,如果您的应用程序充当用户的默认消息客户端,则应该完全实现所有指定的组件。

如果您打算执行任何与SMS / MMS相关的任务,则还需要相关权限。 虽然系统在确定符合条件的默认应用程序候选时显然不会检查这些应用程序,但对于相应的操作,以下权限是必需的:

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

如果您在尝试执行给定操作时缺lessSEND_SMSREAD_SMSWRITE_SMS权限,则会抛出SecurityException 。 但是,如果您错过了RECEIVE_*权限,则您的应用将无法传送相关的广播,而在testing这些function时似乎没有任何事情发生。