2010-07-03 109 views
4

我試圖構建一個使用SmsMessage類應用程序,但也有因設備的API級兩個版本:Android - 支持1.6+,並支持1.5版本的棄用代碼?

android.telephony.gsm.SmsMessage(不建議使用1.6及以上)

android.telephony.SmsMessage(1.6及更高版本的新類)

我想要定位1.5,但在1.6或更高版本的設備上運行較新的類(android.telephony.SmsMessage)。我該怎麼做呢?

我已經厭倦了這一點:http://devtcg.blogspot.com/2009/12/gracefully-supporting-multiple-android.html但我無法得到它的工作(筆者沒有提到他/她如何處理不同的進口,確切的API級別設置等)

感謝。

import java.util.Date; 
import com.apps.myapp.Utilities; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.gsm.SmsMessage;//*NOTE* depreciated in v1.6+ 

public class OfflineSMSReceiver extends SMSReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     System.out.println("SMS_RECEIVED"); 

     System.out.println(Utilities.getNow()); 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 

     Date date; 
     long timeStamp; 
     String time; 
     String str = "";    
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++){ 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
       timeStamp = msgs[i].getTimestampMillis(); 
       date = new Date(timeStamp); 
       time = this.getTime(date.getHours(),date.getMinutes(),date.getSeconds()); 
       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       str += "TIME: "+time+"\t"+this.getNowDate(); 
      } 

      System.out.println(str); 
     } 
    } 
} 

回答

1

您需要將目標設定爲android-4或更高,否則新的類將不存在。

關於加載正確的版本,您可以使用條件類加載,在this sample project中演示了兩個版本的聯繫人內容提供者。另外,谷歌在這個問題上也要說this article

+0

感謝您的回覆。您的第一個鏈接非常有幫助。看完這些代碼後,我想我明白我必須做的事情。關鍵是正確設置抽象類。我會在自己嘗試後回報。再次感謝。 – RyanM 2010-07-03 22:43:47

+0

你的例子完美地工作。爲了確保,因爲我將min SDK設置爲3(目標爲4),應用程序應該在市場上出現運行1.5+以上的設備?再次感謝。 – RyanM 2010-07-04 01:24:44

+0

@ borg17of20:無論您是否出現在Market中,都將由您的清單中的android:minSdkVersion設置確定(請參閱usessdk元素),而不是運行構建工具時的構建目標。 – CommonsWare 2010-07-04 08:32:36

0

使用CommonsWare的例子,我能創造這個(工作):

[清單設置]

1.設置目標SDK 4(或更高版本)(安卓1.6+)

2.設置最小SDK至3(機器人1.5)

[OfflineSMSReceiver.java]

import java.util.Date; 
import com.apps.myapp.Utilities; 
import com.apps.myapp.SmsMessageBridge; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 

public class OfflineSMSReceiver extends SMSReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     System.out.println("SMS_RECEIVED"); 

     System.out.println(Utilities.getNow()); 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessageBridge[] msgs = null; 

     Date date; 
     long timeStamp; 
     String time; 
     String str = "";    
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessageBridge[pdus.length];   
      for (int i=0; i<msgs.length; i++){ 
       msgs[i] = SmsMessageBridge.INSTANCE.createFromPdu((byte[])pdus[i]); 
       timeStamp = msgs[i].getTimestampMillis(); 
       date = new Date(timeStamp); 
       time = this.getTime(date.getHours(),date.getMinutes(),date.getSeconds()); 
       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       str += "TIME: "+time+"\t"+this.getNowDate(); 
      } 

      System.out.println(str); 
     } 
    } 
} 

[SmsMessageBridge.java]

import android.os.Build; 

public abstract class SmsMessageBridge 
{ 
    public abstract SmsMessageBridge createFromPdu(byte[] pdu); 
    public abstract long getTimestampMillis(); 
    public abstract String getOriginatingAddress(); 
    public abstract String getMessageBody(); 

    public static final SmsMessageBridge INSTANCE = getBridge(); 

    private static SmsMessageBridge getBridge() 
    { 
     final int sdkVersion = new Integer(Build.VERSION.SDK).intValue(); 

     if(sdkVersion>3) 
     { 
      return new NewSmsMessage(); 
     } 
     else 
     { 
      return new OldSmsMessage(); 
     } 
    } 
} 

[OldSmsMessage.java]

import android.telephony.gsm.SmsMessage;//*NOTE* depreciated in v1.6+ 

@SuppressWarnings("deprecation") 
public class OldSmsMessage extends SmsMessageBridge 
{ 
    private SmsMessage myMSG; 

    @Override 
    public SmsMessageBridge createFromPdu(byte[] pdu) 
    { 
     myMSG = SmsMessage.createFromPdu(pdu); 
     return this; 
    } 

    @Override 
    public long getTimestampMillis() 
    { 
     return myMSG.getTimestampMillis(); 
    } 

    @Override 
    public String getOriginatingAddress() 
    { 
     return myMSG.getOriginatingAddress(); 
    } 

    @Override 
    public String getMessageBody() 
    { 
     System.out.println("v1.5"); 
     return myMSG.getMessageBody(); 
    } 
} 

[NewSmsMessage.java]

import android.telephony.SmsMessage; 

public class NewSmsMessage extends SmsMessageBridge 
{ 
    private SmsMessage myMSG; 

    @Override 
    public SmsMessageBridge createFromPdu(byte[] pdu) 
    { 
     myMSG = SmsMessage.createFromPdu(pdu); 
     return this; 
    } 

    @Override 
    public String getMessageBody() 
    { 
     //System.out.println("v1.6+"); 
     return myMSG.getMessageBody(); 
    } 

    @Override 
    public String getOriginatingAddress() 
    { 
     return myMSG.getOriginatingAddress(); 
    } 

    @Override 
    public long getTimestampMillis() 
    { 
     return myMSG.getTimestampMillis(); 
    } 

} 

再次感謝CommonsWare。