gpt4 book ai didi

android - 如何编写 ContactsContract 使其在 2.2 中运行并且不会在 1.5 中崩溃?

转载 作者:行者123 更新时间:2023-11-29 02:16:29 26 4
gpt4 key购买 nike

我的 Android 应用程序中有以下代码可以查找联系人 ID,我刚刚将目标从 1.5 更改为 2.2,但最小 SDK 为 3 (1.5),这样我就可以使用 ContactsContract Uri 2.2 和 1.5 中的 People Uri。

但是,当在 1.5 设备上运行时,代码会导致以下错误:

07-27 15:02:53.382: WARN/dalvikvm(12656): VFY: unable to resolve static field 25 (CONTENT_URI) in Landroid/provider/ContactsContract$Contacts;

我从谷歌了解到我需要在这种情况下使用反射来允许应用程序在两个版本的 Android 上运行?

我已经看到了如何使用反射来使用多个/不同版本的方法的示例,但是我如何在我想使用 ContactsContract Uri 的情况下使用它?

这是我的代码:


findViewById(R.id.contactimage).setOnClickListener(new OnClickListener() {
public void onClick(View v) {

String sdk = android.os.Build.VERSION.SDK;
Uri contactUri;
Log.d("CDA", "Contact ID Button pressed = " + contactId);
if(sdk.equals("8")){
contactUri = ContentUris.withAppendedId
(ContactsContract.Contacts.CONTENT_URI, contactId);

Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
startActivity(intent);

}
else{
contactUri = ContentUris.withAppendedId
(People.CONTENT_URI, contactId);

Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
startActivity(intent);
}

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
}
});

编辑:

这是一个如何完成的例子:

private static Uri CONTENT_URI=null;
private static String NAME_URI=null;
private static String ID_URI=null;
private static String NUMBER_URI = null;
private static Uri PHONE_LOOKUP = null;
static int sdk;
static {
sdk=new Integer(Build.VERSION.SDK).intValue();

if (sdk>=5) {
try {
Class clazz=Class.forName("android.provider.ContactsContract$CommonDataKinds$Phone");
Class clazz_phonelookup=Class.forName("android.provider.ContactsContract$PhoneLookup");

NAME_URI=(String)clazz.getField("DISPLAY_NAME").get(clazz);
ID_URI=(String)clazz.getField("_ID").get(clazz);

NUMBER_URI=(String)clazz.getField("NUMBER").get(clazz);
PHONE_LOOKUP =(Uri)clazz_phonelookup.getField("CONTENT_FILTER_URI").get(clazz);


}
catch (Throwable t) {
Log.e("reflection", "Exception when determining CONTENT_URI", t);
}
}
else {
CONTENT_URI=Contacts.People.CONTENT_URI;

NAME_URI=People.NAME;
ID_URI=People._ID;

NUMBER_URI=People.NUMBER;
PHONE_LOOKUP = null;

}
}

最佳答案

文档中的这个演示为适用于 API 级别 3/4 和 API 级别 5+ 的两个不同的 SDK 特定类定义了一个父类。

这帮助我理解了 Contacts 和 ContactsContract 之间的区别,并允许通过在包装类中获取操作系统 API 级别来隐式使用两者。

http://developer.android.com/resources/samples/BusinessCard/index.html

希望这对您有所帮助!

关于android - 如何编写 ContactsContract 使其在 2.2 中运行并且不会在 1.5 中崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com