在Android中,我可以轻松获取SDK的版本(
我认为反射是必要的(我已经阅读了这个链接,但对于一个类或者对我来说并不清晰)。
以下是代码,但它给我一个异常,因为在我的Android 1.6中,即使未应用条件,编译器也会验证包是否存在:
Build.VERSION.SDK
),但是只有在平台版本高于1.6(>Build.VERSION_CODES.DONUT
)时才需要使用LabeledIntent。我认为反射是必要的(我已经阅读了这个链接,但对于一个类或者对我来说并不清晰)。
以下是代码,但它给我一个异常,因为在我的Android 1.6中,即使未应用条件,编译器也会验证包是否存在:
Intent theIntent=....;
if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT)
{
try{
Intent intentChooser = Intent.createChooser(intent,"Choose between these programs");
Parcelable[] parcelable = new Parcelable[1];
parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0);
intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable);
activity.startActivity(intentChooser);
}
catch(Exception e)
{
activity.startActivity(theIntent);
}
} else
{
activity.startActivity(intentMedicamento);
}
我如何解决它,一些正确答案的笔记
@Commonsware指导我如何做到这一点。我们创建了一个桥接类,这样根据API LEVEL,您可以实例化使用一个API LEVEL或另一个API LEVEL的另一个类。 唯一一个初学者可能会忘记的细节是,您必须使用最新的SDK编译您的应用程序,以便引用。
public abstract class LabeledIntentBridge {
public abstract Intent BuildLabeledIntent(String URL, Intent theintent);
public static final LabeledIntentBridge INSTANCE=buildBridge();
private static LabeledIntentBridge buildBridge() {
int sdk=new Integer(Build.VERSION.SDK).intValue();
if (sdk<5) {
return(new LabeledIntentOld());
}
return(new LabeledIntentNew());
}
}
因此,在LabeledIntentNew
中,我包含了所有代码,这些代码仅适用于API LEVEL 5中可用的LabeledIntent
。 在LabeledIntentOld
中,我可以实现另一种控制方式,在我的情况下,我返回意图本身而不进行其他操作。
调用此类的方法如下:
LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);