2015-07-02 176 views
0

我正在使用代碼從設備獲取所有消息。在一個活動中執行時它可以正常工作,但由於某種原因,它在服務中不起作用。從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()已棄用

+0

你會得到什麼錯誤? – germi

+0

我收到錯誤信息:無法解析startManagingCursor()。我試過使用context.startManagingCursor(),但它不工作。 – Sanju

回答

1

startManagingCursor()方法在API級別11中已棄用。請使用新的CursorLoader類替換爲LoaderManager;這也可以通過Android兼容性套件在較早的平臺上使用。

結帳this tutorial series

我到處讀到startManagingCursor方法已被棄用,您應該使用CursorLoader類。 如果您願意繼承FragmentActivity,那麼您可以在Android支持包中使用Loader框架實現,一直回到Android 1.6。

這就是說,Android中的「棄用」通常意味着「我們將繼續支持這一點,但我們認爲有更好的解決方案」。您當然可以在API Level 11+上使用startManagingCursor()。然而,託管遊標存在的問題(尤其是在主應用程序線程上重新啓動活動時,它們會重新查詢())仍舊存在於較舊和較新的Android版本中。

但這是否意味着即使對於支持API級別爲< 11的應用程序,您也應該使用CursorLoader類? 你當然可以和其他所有事物一樣,你可能應該這樣做。然而,其他的幾乎都是平等的,FragmentActivity要求可能會成爲你的問題。

如果你正在開發一個新的應用程序,今天你應該從一開始就考慮碎片,在這種情況下你會使用FragmentActivity,因此使用Loader應該不成問題。

我似乎無法使用api導入光標加載器類4 Loader的Android支持包實現工作在API Level 4及更高版本上。