Android — 支持 1.6+,并支持 1.5 中已弃用的代码?

发布于 2024-09-08 06:36:57 字数 2095 浏览 8 评论 0原文

我正在尝试构建一个使用 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/graceively-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);
        }
    }
}

I'm trying to build a app that uses the SmsMessage class but there are two versions depending on the API level of the device:

android.telephony.gsm.SmsMessage (deprecated for 1.6 and above)

android.telephony.SmsMessage (the new class for 1.6 and up)

I want to target 1.5 and yet have the newer class (android.telephony.SmsMessage) run on devices with 1.6 or higher. How do I do this?

I have already tired this: http://devtcg.blogspot.com/2009/12/gracefully-supporting-multiple-android.html but I couldn't get it to work (the author doesn't mention how he/she handles the different imports, the exact api level settings etc.)

Thanks.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

留一抹残留的笑 2024-09-15 06:36:57

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

关于加载正确的版本,您可以使用条件类加载,如 此示例项目适用于联系人内容提供程序的两个版本。另外,这篇文章是 Google 关于这个主题的说法。

You will need to target android-4 or higher, otherwise the newer class will not exist.

With respect to loading in the correct version, you can use conditional class loading, demonstrated in this sample project for the two editions of the contacts content provider. Also, this article is what Google has to say on the subject.

醉梦枕江山 2024-09-15 06:36:57

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

[清单设置]

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

2.将最小SDK设置为3(Android 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。

Using CommonsWare's example, I was able to create this (which works):

[manifest settings]

1.Set the target SDK to 4 (or higher) (Android 1.6+)

2.Set the min SDK to 3 (Android 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();
    }

}

Thanks again to CommonsWare.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文