【问题标题】:Android -- Support 1.6+, and Support for Deprecated Code in 1.5?Android -- 支持 1.6+,并支持 1.5 中的弃用代码?
【发布时间】:2010-07-03 20:54:52
【问题描述】:

我正在尝试构建一个使用 SmsMessage 类的应用,但根据设备的 API 级别有两个版本:

android.telephony.gsm.SmsMessage(1.6 及更高版本已弃用)

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

我想以 1.5 为目标,但让更新的类 (android.telephony.SmsMessage) 在 1.6 或更高版本的设备上运行。我该怎么做?

我已经厌倦了这个: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);
        }
    }
}

【问题讨论】:

    标签: android api deprecated


    【解决方案1】:

    您需要以android-4 或更高版本为目标,否则新的类将不存在。

    关于在正确版本中加载,您可以使用条件类加载,在this sample project 中针对联系人内容提供程序的两个版本进行了演示。另外,this article 是谷歌在这个问题上必须说的。

    【讨论】:

    • 感谢您的回复。您的第一个链接非常有帮助。看了那段代码后,我想我明白我必须做什么了。关键是正确设置抽象类。我会在自己尝试后报告。再次感谢。
    • 您的示例运行良好。只是为了确保,因为我将 min SDK 设置为 3(目标为 4),所以该应用程序应该出现在市场上运行 1.5+ 的设备上?再次感谢。
    • @borg17of20:您是否出现在市场中将取决于您在清单中的android:minSdkVersion 设置(请参阅uses-sdk 元素),而不是运行构建工具时的构建目标.
    【解决方案2】:

    使用 CommonsWare 的示例,我能够创建这个(有效):

    [清单设置]

    1.将目标SDK设置为4(或更高)(Android 1.6+)

    2.设置 min SDK 为 3 (Android 1.5)

    [离线短信接收器.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。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多