2010-07-03 4 views
4

Je suis en train de construire une application qui utilise la classe SmsMessage mais il y a deux versions en fonction du niveau de l'API de l'appareil:Android - Support 1.6+, et le soutien pour le code obsolète en 1.5?

android.telephony.gsm.SmsMessage (dépréciée pour 1,6 et plus)

android.telephony.SmsMessage (la nouvelle classe pour 1.6 et plus)

Je veux cibler 1.5 et avoir la nouvelle classe (android.telephony.SmsMessage) sur les appareils avec 1.6 ou plus. Comment puis-je faire cela?

J'ai déjà fatigué ceci: http://devtcg.blogspot.com/2009/12/gracefully-supporting-multiple-android.html mais je ne pouvais pas le faire fonctionner (l'auteur ne mentionne pas comment il/elle gère les différentes importations, les paramètres exacts de niveau api etc.)

Merci.

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

Répondre

1

Vous aurez besoin de cibler android-4 ou plus, sinon la nouvelle classe ne sera pas exister. En ce qui concerne le chargement dans la version correcte, vous pouvez utiliser un chargement de classe conditionnel, illustré par this sample project pour les deux éditions du fournisseur de contenu de contacts. En outre, this article est ce que Google a à dire sur le sujet.

+0

Merci de votre réponse. Votre premier lien a été très utile. Après avoir regardé ce code, je pense que je comprends ce que je dois faire. La clé configure correctement la classe abstraite. Je rapporterai après avoir essayé ceci par moi-même. Merci encore. – RyanM

+0

Votre exemple a parfaitement fonctionné. Juste pour s'assurer, parce que je mets le min SDK à 3 (cible à 4), l'application devrait apparaître sur le marché pour les appareils qui fonctionnent 1.5+? Merci encore. – RyanM

+0

@ borg17of20: Que vous apparaissiez ou non sur le Marché sera déterminé par votre paramètre 'android: minSdkVersion' dans votre manifeste (voir l'élément' uses-sdk'), et non par votre cible de construction lors de l'exécution des outils de construction. – CommonsWare

0

En utilisant l'exemple de CommonsWare, j'ai pu créer ce (qui fonctionne):

[Paramètres manifestes]

1.Réglez le SDK cible à 4 (ou plus) (Android 1.6+)

2.Réglez le SDK min à 3 (applications 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(); 
    } 

} 

Merci encore à CommonsWare.

Questions connexes