从Android设备获取所有消息

时间:2015-07-02 13:01:13

标签: android

我正在使用代码从设备获取所有消息。它在活动中执行时工作正常,但由于某种原因,它在服务内部时无效。

我正在使用以下代码:

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() 已弃用

1 个答案:

答案 0 :(得分:1)

startManagingCursor()方法在API级别11中已弃用。请将新的CursorLoader类与LoaderManager一起使用;这也可以通过Android兼容包在旧版平台上使用。

查看this tutorial series

我到处读到不推荐使用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及更高版本。