2010-07-03 3 views
4

Я пытаюсь создать приложение, которое использует класс SMSMessage, но есть две версии в зависимости от уровня API устройства:Android - Поддержка 1.6+ и поддержка устаревшего кода в 1,5?

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

ответ

1

Вам нужно будет предназначаться android-4 или выше, в противном случае новый класс не будет существовать.

Что касается загрузки в правильной версии, вы можете использовать загрузку условного класса, продемонстрированную в this sample project для двух изданий поставщика контента контактов. Кроме того, this article - это то, что Google должен сказать по этому вопросу.

+0

Спасибо, что ответили. Ваша первая ссылка была очень полезной. Посмотрев на этот код, я думаю, что понимаю, что мне нужно делать. Ключ правильно настраивает абстрактный класс. Я отчитаюсь после того, как попытаюсь это сделать самостоятельно. Еще раз спасибо. – RyanM

+0

Ваш пример отлично работал. Просто чтобы убедиться, потому что я установил минимальный SDK в 3 (цель до 4), приложение должно появиться на рынке для устройств с 1.5+? Еще раз спасибо. – RyanM

+0

@ borg17of20: независимо от того, обнаруживаетесь ли вы на рынке, ваш параметр 'android: minSdkVersion' будет указан в вашем манифесте (см. Элемент' uses-sdk'), а не вашей целью сборки при запуске инструментов сборки. – CommonsWare

0

Используя пример CommonsWare, я был в состоянии создать это (который работает):

[манифеста настройки]

1.Задайте целевой SDK 4 (или выше) (Android 1.6+)

2.Set минимальное 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.