6

テキストメッセージのリストを取得して、在庫アプリケーションやGosmsproのように表示する必要があります。私は次のコードを使用しています:

uriSms = Uri.parse("content://mms-sms/conversations");  
Cursor cursor = getContentResolver().query(uriSms, new String[] {"*"}, null, null, "date DESC");   
cursor.moveToFirst();  
do{    
    try{
        String address = cursor.getString(32);  
        if(address == null){
            address = "";   //phone number
        }else{
            address = getContactName(address);  
        }
        String body = cursor.getString(2);  
        System.out.println("======> Mobile number => "+address);  
        System.out.println("=====> SMS Text => "+body);  
    }catch (Exception e) {
        e.printStackTrace();  
    }
}while(cursor.moveToNext());

ギャラクシータブ(android 2.2)では動作しますが、s3(ICS)アプリケーションでは起動時にクラッシュします。mmsを解析したくないので、使用してみました

uriSms = Uri.parse("content://sms/conversations");

しかし、両方のデバイスでは機能しませんでした。私は解決策を見つけるためにたくさんグーグルで検索しましたが、何も見つかりませんでした。私は、SMS会話へのアクセスがAndroidOSとデバイスに依存していることを発見しただけです。私の目的は、すべてのAndroidデバイス2.2以降をサポートするアプリケーションを作成することです。ストックアプリケーションでは、Thread.CONTENT_URIを使用して、会話としてSMSリストを取得します。

Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build();

しかし、クラスThreadにはソースコードが提供されておらず、インターネットで見つけることができません。HandcentSmsやGOsmsproと同じように、すべてのAndroidデバイス(2.2以降)でアプリケーションを実行するにはどうすればよいですか。

4

2 に答える 2

2

クエリされたテーブルに、という名前の列が含まれていると想定しているため、コードがクラッシュしていますaddress。すべてのAndroidバージョンが会話にアドレスを格納しているわけではありません。テーブルの構造を確認するには、次のコードを使用して列名と内容を表示できます。

ArrayList<String> conversation = new ArrayList<>();

Uri    uri    = Uri.parse( "content://sms/conversations/" );
Cursor cursor = getContentResolver().query( uri, null, null ,null, null );

startManagingCursor( cursor );
if( cursor.getCount() > 0 ) {
    String count = Integer.toString( cursor.getCount() );

    while( cursor.moveToNext() ) {
        String result = "";

        for( int i = 0; i < cursor.getColumnCount(); i++ ) {
            result = result + "\nindex " + i + "\n column is "
                + cursor.getColumnName( i ) + "\nvalue is " + cursor.getString( i );
        }

        result = result + "\n new conversation";
        conversation.add( result );
    }
}

cursor.close();

thread_id考えられる回避策は、次のようにアドレスを検索するためのパラメータとしてを使用することです。

ArrayList<String> conversation = new ArrayList<>();
// We may use sms/sent or sms/inbox
Uri    uri    = Uri.parse( "content://sms" );
Cursor cursor = getContentResolver().query( uri, null, "thread_id" + " = " + threadId ,null, null );

startManagingCursor( cursor );
if( cursor.getCount() > 0 ) {
    String count = Integer.toString( cursor.getCount() );

    while( cursor.moveToNext() ){
        String result = "";

        for( int i = 0; i < cursor.getColumnCount(); i++ ) {
            result = result + "\nindex " + i + "\n column is "
                + cursor.getColumnName( i ) + "\nvalue is " + cursor.getString( i );
        }

        result = result + "\n new conversation";
        conversation.add( result );
    }
}

cursor.close();
于 2013-02-19T10:51:00.280 に答える
1
final StringBuilder msgString = new StringBuilder();
// ************** SMS ********************* 
List<SMSData> smsList = new ArrayList<SMSData>();

Uri uri = Uri.parse("content://sms/");
Cursor c= 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++) {

        SMSData sms = new SMSData();
        sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
        sms.setDate(c.getString(c.getColumnIndexOrThrow("date")).toString());
        sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
        smsList.add(sms);

        String address  = c.getString(c.getColumnIndexOrThrow("address")).toString();
        String mbody    = c.getString(c.getColumnIndexOrThrow("body")).toString();
        String mdate    = c.getString(c.getColumnIndexOrThrow("date")).toString();
        Date dt = new Date(Long.valueOf(mdate));

        msgString.append(address + "<-||->");
        msgString.append(mbody  + "<-||->");
        msgString.append(dt  + "<-||->");
        msgString.append(mdate + "<--!-->");

        c.moveToNext();
    }       
}

c.close();
于 2015-08-15T11:40:23.037 に答える