2015-07-02 3 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() is устарел.

+0

Какая ошибка у вас? – germi

+0

Я получаю ошибку как: не могу разрешить startManagingCursor(). Я попытался использовать context.startManagingCursor(), но не работал. – Sanju

ответ

1

Метод startManagingCursor() устарел на уровне API 11. Используйте новый класс CursorLoader вместо LoaderManager; это также доступно на старых платформах через пакет совместимости с Android.

Отъезд this tutorial series.

Я читаю везде, что метод startManagingCursor устарел, и вы должны использовать класс CursorLoader. Если вы хотите наследовать от FragmentActivity, вы можете использовать реализацию фреймворка Loader в пакете поддержки Android, полностью перейдя на Android 1.6.

Это, как говорится, «устарело» на Android, как правило, означает «мы будем продолжать поддерживать это, но мы считаем, что есть лучшие решения». Вы можете использовать startManagingCursor() на уровне API 11+. Тем не менее, проблемы с управляемыми курсорами (в частности, что они requery() при перезапуске активности в основном потоке приложения) все еще существуют, в старых и новых версиях Android.

Но это значит, что вы должны использовать класс CursorLoader даже для приложений, поддерживающих уровни API < 11? Вы, безусловно, можете, и, при прочих равных условиях, вы, вероятно, должны. Однако все остальное редко бывает равным, и требование FragmentActivity может быть проблемой для вас.

Если вы разрабатываете новое приложение, сегодня вы должны думать о фрагментах с самого начала, и в этом случае вы все равно будете использовать FragmentActivity, и поэтому использование Loader не должно быть проблемой.

Я не могу импортировать класс загрузчика курсора с api 4 Реализация пакета поддержки Android для Loader работает с API уровня 4 и выше.

Смежные вопросы