我正在使用代码从设备获取所有消息。它在活动中执行时工作正常,但由于某种原因,它在服务内部时无效。
我正在使用以下代码:
public class GetMessageData {
Context context;
GetMessageData(Context context){
this.context = context;
}
public JSONObject GetSMSDetails()
{
JSONObject result = null;
JSONArray jarray = null;
String link[] = {"content://sms/inbox","content://sms/sent","content://sms/draft"};
try {
jarray = new JSONArray();
result = new JSONObject();
Uri uri = Uri.parse("content://sms/");
Cursor c= context.getContentResolver().query(uri, null, null ,null,null);
startManagingCursor(c);
// Read the sms data and store it in the list
if(c.moveToFirst()) {
for(int i=0; i < c.getCount(); i++) {
result.put("body",c.getString(c.getColumnIndexOrThrow("body")).toString());
result.put("date",c.getString(c.getColumnIndexOrThrow("date")).toString());
result.put("read",c.getString(c.getColumnIndexOrThrow("read")).toString());
result.put("type",c.getString(c.getColumnIndexOrThrow("type")).toString());
if((c.getString(c.getColumnIndexOrThrow("type")).toString()).equals("3"))
{
//Cursor cur= getContentResolver().query("", null, null ,null,null);
//startManagingCursor(cur);
String threadid = c.getString(c.getColumnIndexOrThrow("thread_id")).toString();
Cursor cur= context.getContentResolver().query(Uri.parse("content://mms-sms/conversations?simple=true"), null, "_id ="+threadid ,null,null);
startManagingCursor(cur);
if(cur.moveToFirst())
{
String recipientId = cur.getString(cur.getColumnIndexOrThrow("recipient_ids")).toString();
cur= context.getContentResolver().query(Uri.parse("content://mms-sms/canonical-addresses"), null, "_id = " + recipientId, null, null);
startManagingCursor(cur);
if(cur.moveToFirst())
{
String address = cur.getString(cur.getColumnIndexOrThrow("address")).toString();
result.put("address",address);
cur.close();
}
}
}else
{
result.put("address",c.getString(c.getColumnIndexOrThrow("address")).toString());
}
jarray.put(result);
result = new JSONObject();
c.moveToNext();
}
}
c.close();
result.put("smslist", jarray);
//result = new JSONObject(jarray.toString());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
在此代码中,我在startManagingCursor()
收到错误。
在搜索时,我发现startManagingCursor()
已弃用。
答案 0 :(得分:1)
startManagingCursor()方法在API级别11中已弃用。请将新的CursorLoader类与LoaderManager一起使用;这也可以通过Android兼容包在旧版平台上使用。
我到处读到不推荐使用startManagingCursor方法,你应该使用CursorLoader类。 如果您愿意从FragmentActivity继承,您可以使用Android支持包中的Loader框架实现,一直回到Android 1.6。
话虽如此,Android中的“弃用”通常意味着“我们会继续支持这一点,但我们认为有更好的解决方案”。您当然可以在API Level 11+上使用startManagingCursor()。但是,在较旧和较新的Android版本上,托管游标(特别是它们在主应用程序线程上重新启动活动时重新查询())的问题仍然存在。
但这是否意味着你应该使用CursorLoader类,即使是支持API级别的应用程序&lt; 11? 你当然可以,而且,在其他条件相同的情况下,你可能应该这样做。但是,其他所有内容都很少相同,FragmentActivity要求对您来说可能是一个问题。
如果你正在开发一个新的应用程序,今天你应该从一开始就考虑片段,在这种情况下你将使用FragmentActivity,因此使用Loader应该不是问题。
我似乎无法使用api 4导入游标加载器类 Loader的Android Support包实现适用于API Level 4及更高版本。