2017-10-16 1 views
0

아래 코드를 사용하여 sms에서 메시지를 가져옵니다.Telephony.Sms를 사용하여 잠긴 메시지를 포함하여 모든 대화의 마지막 메시지 만 검색하는 방법?

private List<String> getEveryLastMessages(){ 
    List<String> listSms = new ArrayList<String>(); 
    ContentResolver contentResolver = getActivity().getContentResolver(); 

    Cursor c = contentResolver.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs 
       new String[] { Telephony.Sms.Inbox.BODY }, // Select body text 
       null, 
       null, 
       Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order 

    int totalSMS = c.getCount(); 

    if (c.moveToFirst()) { 
     for (int i = 0; i < totalSMS; i++) { 
      listSms.add(c.getString(0)); 
      listSms.add("\n"); 
      c.moveToNext(); 
     } 
    } else { 
     //Do something, no messages 
    } 
    c.close(); 

     return listSms; 
} 

내 문제는 잠긴 메시지를 제외한 모든 메시지가 검색되었습니다.

내가 달성하려고 시도하는 것은 잠금 메시지를 포함한 모든 대화의 마지막 메시지 인 만 가져오고이를받은 편지함으로 표시하기 위해 내 recyclerview adapater에 채 웁니다.

+0

흠, 표준 동작처럼 보이지 않습니다. 잠긴 메시지가 수신 된 메시지라는 것을 확신합니까? 즉,받은 편지함에 있는지 확인하십시오. 어떤 Android 버전을 테스트하고 있습니까? 이것이 실제 장치라면, 구체적으로 무엇입니까? 또한, "모든 대화의 마지막 메시지"를 원한다고 명시합니다. 마지막 메시지가 보낸 메시지라면 어떻게 될까요? 귀하의 필요에 따라 [이 게시물] (https://stackoverflow.com/q/42068940) 도움이 될 수도 있습니다. –

+0

그래, 잠긴 메시지는 수신 된 메시지입니다. 잠긴 메시지가받은 편지함에 있는지는 확실하지 않지만 안드로이드의 기본 메신저에는 목록에있는 메시지가 있지만 잠겨 있습니다. 현재 Android Marshmallow에서 테스트하고 있습니다. 그렇습니다. 실제 모델은 INFINIX HOT S X521 인 실제 장치를 사용하고 있습니다. 모든 대화의 마지막 내용 인 경우 마지막 메시지를 보내거나, 보내지 못했거나, 초안을 작성하거나, 잠근 것은 중요하지 않습니다. 고마워, 나는 그 지점을 점검 할 것이다. – Polar

+0

좋아요, 수신/수신함에 대해 묻는 중이었습니다. 전화 걸기에서 '전화 받기. 전화. 연결'을 쿼리하고 있기 때문입니다. Anyhoo는 Marshmallow에서 시작하여 기본이 아닌 앱은 SMS 테이블의 제한된보기에만 액세스 할 수 있으며 _inbox_ 및 _sent_ 메시지 만받을 수 있으므로 앱이 기본 메시징 앱이 아닌 경우 _failed_ 또는 _draft_ 메시지를받지 않습니다. 그러나 _locked_는 그 (것) 들과는 별개의 것이므로, 적어도 표준 API에서는 그 제한된 관점을 생각해서는 안됩니다. 그러나 OEM은이를 변경할 수 있습니다. –

답변

0

보내거나받은 여부에 관계없이 각 대화의 마지막 메시지를 원하는 경우 모든 것을 잡아 내고 필터링하는 대신 사용할 수있는 편리한 기본 제공 URI가 있습니다.

Telephony.Sms.Conversations.CONTENT_URI (android.provider 패키지 내)은 ContentResolver 쿼리에서 사용 가능한 대화 요약을 검색하는 데 사용할 수 있습니다. 예를 들어 :

  • Telephony.Sms.Conversations.SNIPPET ("snippet")
  • Telephony.Sms.Conversations.MSG_COUNT ("msg_count")
  • Telephony.Sms.Conversations.THREAD_ID ("thread_id")

SNIPPET :

Cursor c = contentResolver.query(Telephony.Sms.Conversations.CONTENT_URI, 
           null, null, null, null); 

이 쿼리는 세 개의 열이 반환됩니다 칼럼 해당 대화에서 가장 최근에 사용 가능한 메시지가됩니다.

마쉬 멜로우 (API 레벨 21)부터 시작하여 기본 메시지 앱이 아닌 앱은 제한된 SMS 테이블보기에만 액세스 할 수 있습니다. 이러한 앱은 Telephony.Sms.TYPEMESSAGE_TYPE_INBOX 또는 MESSAGE_TYPE_SENT 인 메시지 만 가져올 수 있습니다. 즉, 앱이 현재 기본 앱이 아닌 경우 MESSAGE_TYPE_FAILED, MESSAGE_TYPE_DRAFT 등을받지 못합니다.

그러나 Telephony.Sms.LOCKED 열은 TYPE 열과 완전히 별개의 범주이므로 제한된보기로 분류해서는 안됩니다. 즉, 앱이 기본값이든 상관없이 또는 받은 편지함에 전송 된 경우 잠긴 메시지를 가져올 수 있어야합니다. 물론 제조업체가 설명 된 동작을 변경했을 가능성이 있으며 앱에서이를 설명해야 할 수도 있습니다.

관련 문제