Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 4.4 (KitKat) SMS Apis Change——Android 4.4的一個重大變化

Android 4.4 (KitKat) SMS Apis Change——Android 4.4的一個重大變化

編輯:關於Android編程

 Android團隊通過Android開發博客透漏今年會放出Android 4.4 (KitKat) ,同時更新了 SMS 的部分API。博客上講只有default SMS app才能對短信數據庫有寫權限,但是用戶可以把第三方應用設置為default SMS app。有些中文的報道說“在Android 4.4中,只有默認的信息應程序才有權限接收和發送短信”,本文作者認為是不完全正確的,非default SMS app也能讀寫短信,只不過是不能寫入短信數據庫中。我們看一看android開發者博客是怎麼講述其他應用短信接收和發送問題的。   1)接收短信問題: [html]  Other apps that only want to read new messages can instead receive the    SMS_RECEIVED_ACTION broadcast intent when a new SMS arrives.          其他應用可以接收SMS_RECEIVED_ACTION的廣播接收到短信,接收到這個廣播,短信不會寫入短信數據庫。 2)發送短信問題: [html]   When your app is not currently selected as the default SMS app, it's important that you    disable the ability to send new messages from your app because, without the ability to    write to the SMS Provider, any messages you send won't be visible in the user's default SMS app.          沒有default SMS app能力的app發送短信,不會出現在短信數據庫中。   Android開發者博客中重點講到了3個方面的問題: 1、怎麼開發default SMS app 2、怎麼提示用戶設置自己的app為default SMS app 3、對短信備份恢復類App的一點建議   怎麼開發default SMS app       現存的短信類App不會默認升級為default SMS app,需要完成Android新的規范協議。Android 4.4中,系統收到短信時,只有一個應用能收到SMS_DELIVER_ACTION,這個應用就是default SMS app,WAP_PUSH_DELIVER_ACTION也是類似。如果現存的短信類App不做改造,運行在Android 4.4也不會Crash,但是寫入短信數據庫數據時會失敗。       為了使你的應用出現在系統設置的Default SMS app中,你需要在manifest 文件聲明一下幾種能力。   1、接收SMS_DELIVER_ACTION("android.provider.Telephony.SMS_DELIVER")的broadcast receiver,這個broadcast receiver需要有BROADCAST_SMS權限。 這些是為了讓你的應用能接收到SMS messages。   2、接收WAP_PUSH_DELIVER_ACTION("android.provider.Telephony.WAP_PUSH_DELIVER") 的broadcast receiver,這個需要BROADCAST_WAP_PUSH權限。 這些是為了讓你的應用能接收到MMS  messages。   3、實現發送短信功能,需要有個Activity完成ACTION_SENDTO("android.intent.action.SENDTO")intent filter,並使用schemas, sms:, smsto:, mms:, 以及 mmsto:。 這可以使其他應用調用你的發短信能力。   4、實現一個提供intent filter for ACTION_RESPONSE_VIA_MESSAGE("android.intent.action.RESPOND_VIA_MESSAGE") with schemas, sms:, smsto:, mms:, and mmsto服務。這個服務需要 SEND_RESPOND_VIA_MESSAGE權限。 這允許用戶使用您的應用程序提供即時短信回應電話呼入。   下面是一個manifest文件的例子: [html  <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>           Android 4.4可以使用SMS_RECEIVED_ACTION廣播來觀察收到了短信,這樣可以知道特定的短信收到了,但是我們不能對接收到短信做處理。     設置自己的app為default SMS app       Android4.4中提供了新的方法 Telephony.Sms.getDefaultSmsPackage(),可以獲取到當前Default SMS app的包名。用戶打開你的應用時可以通過判斷知道自己的應用是否為Default SMS app。如果不是,可以通過startActivity() 方法啟動類似如下的Dialog。具體實現可參考下面的代碼。   [java]  public class ComposeSmsActivity extends Activity {          @Override       protected void onResume() {           super.onResume();              final String myPackageName = getPackageName();           if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {               // App is not default.               // Show the "not currently set as the default SMS app" interface               View viewGroup = findViewById(R.id.not_default_app);               viewGroup.setVisibility(View.VISIBLE);                  // Set up a button that allows the user to change the default SMS app               Button button = (Button) findViewById(R.id.change_default_app);               button.setOnClickListener(new View.OnClickListener() {                   public void onClick(View v) {                       Intent intent =                               new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);                       intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,                                myPackageName);                       startActivity(intent);                   }               });           } else {               // App is the default.               // Hide the "not currently set as the default SMS app" interface               View viewGroup = findViewById(R.id.not_default_app);               viewGroup.setVisibility(View.GONE);           }       }   }         對短信備份恢復類App的一點建議       短信備份恢復類應用沒有Default SMS app的能力,不能寫入短信數據庫數據,就起不到恢復短信的作用了。Android開發者博客給出的建議是臨時的設置自己的應用為Default SMS app,臨時獲取一次寫入短信數據庫數據能力,等短信恢復完成再改回原來的應用為Default SMS app。   1、獲取默認App的包名並保存。 [java] view plaincopyprint? String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);     2、讓用戶修改你的app為Default SMS app [java]   Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);   intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());   startActivity(intent);     3、恢復完短信,再讓用戶修改回Default SMS app,使用第一步保存的包名。 [java]   Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);   intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);   startActivity(intent);           上面是一些Android4.4短信變化的介紹,大部分是翻譯自Android開發者博客,由於作者英語水平有限,可能與原作者的理解有些出入,敬請讀者諒解。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved