2010-07-03 146 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。