受信トレイからメッセージを読み取って、アクティビティに表示しようとしています。私の活動にはボタンとリストビューが含まれています。ボタンをクリックすると、受信ボックスからのすべてのメッセージが表示されます。しかし、私の要件は、特定の番号からのメッセージを表示する必要があることです。特定の番号に関連付けられている特定のメッセージのみを更新する必要があるクリックボタンをクリックすると、その番号からメッセージを受け取ったときに、アプリケーションが実行されていません。これが関連するコードです。
myActivity.Java:
public class SecureMessagesActivity extends Activity implements OnClickListener, OnItemClickListener {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme( Android.R.style.Theme_Light );
setContentView(R.layout.main);
this.findViewById( R.id.UpdateList ).setOnClickListener( this );
}
ArrayList<String> smsList = new ArrayList<String>();
public void onItemClick( AdapterView<?> parent, View view, int pos, long id ) {
try {
String[] splitted = smsList.get( pos ).split("\n");
String sender = splitted[0];
String encryptedData = "";
for ( int i = 1; i < splitted.length; ++i ) {
encryptedData += splitted[i];
}
String data = sender + "\n" + StringCryptor.decrypt( new String(SmsReceiver.PASSWORD), encryptedData );
Toast.makeText( this, data, Toast.LENGTH_SHORT ).show();
}
catch (Exception e) {
e.printStackTrace();
}
}
public void onClick( View v ) {
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, null);
int indexBody = cursor.getColumnIndex( SmsReceiver.BODY );
int indexAddr = cursor.getColumnIndex( SmsReceiver.ADDRESS );
if ( indexBody < 0 || !cursor.moveToFirst() ) return;
smsList.clear();
do {
String str = "Sender: " + cursor.getString( indexAddr ) + "\n" + cursor.getString( indexBody );
smsList.add( str );
}
while( cursor.moveToNext() );
ListView smsListView = (ListView) findViewById( R.id.SMSList );
smsListView.setAdapter( new ArrayAdapter<String>( this, Android.R.layout.simple_list_item_1, smsList) );
smsListView.setOnItemClickListener( this );
}
}
SmsReceiver.Java:
public class SmsReceiver extends BroadcastReceiver {
public static final String SMS_EXTRA_NAME = "pdus";
public static final String SMS_URI = "content://sms";
public static final String ADDRESS = "address";
public static final String PERSON = "person";
public static final String DATE = "date";
public static final String READ = "read";
public static final String STATUS = "status";
public static final String TYPE = "type";
public static final String BODY = "body";
public static final String SEEN = "seen";
public static final int MESSAGE_TYPE_INBOX = 1;
public static final int MESSAGE_TYPE_SENT = 2;
public static final int MESSAGE_IS_NOT_READ = 0;
public static final int MESSAGE_IS_READ = 1;
public static final int MESSAGE_IS_NOT_SEEN = 0;
public static final int MESSAGE_IS_SEEN = 1;
public static final byte[] PASSWORD = new byte[]{ 0x20, 0x32, 0x34, 0x47, (byte) 0x84, 0x33, 0x58 };
public void onReceive( Context context, Intent intent ) {
Bundle extras = intent.getExtras();
String messages = "";
if ( extras != null ) {
Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
ContentResolver contentResolver = context.getContentResolver();
for ( int i = 0; i < smsExtra.length; ++i ) {
SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
String body = sms.getMessageBody().toString();
String address = sms.getOriginatingAddress();
messages += "SMS from " + address + " :\n";
messages += body + "\n";
putSmsToDatabase( contentResolver, sms );
}
// Display SMS message
Toast.makeText( context, messages, Toast.LENGTH_SHORT ).show();
}
// WARNING!!!
// If you uncomment next line then received SMS will not be put to incoming.
// Be careful!
// this.abortBroadcast();
}
private void putSmsToDatabase( ContentResolver contentResolver, SmsMessage sms ) {
ContentValues values = new ContentValues();
values.put( ADDRESS, sms.getOriginatingAddress() );
values.put( DATE, sms.getTimestampMillis() );
values.put( READ, MESSAGE_IS_NOT_READ );
values.put( STATUS, sms.getStatus() );
values.put( TYPE, MESSAGE_TYPE_INBOX );
values.put( SEEN, MESSAGE_IS_NOT_SEEN );
try {
String encryptedPassword = StringCryptor.encrypt( new String(PASSWORD), sms.getMessageBody().toString() );
values.put( BODY, encryptedPassword );
}
catch ( Exception e ) {
e.printStackTrace();
}
// Push row into the SMS table
contentResolver.insert( Uri.parse( SMS_URI ), values );
}
}
次のコードを試してみてください。
import Java.util.ArrayList;
import Android.app.Activity;
import Android.content.ContentResolver;
import Android.content.Context;
import Android.database.Cursor;
import Android.net.Uri;
import Android.os.Bundle;
import Android.util.Log;
public class MainActivity extends Activity {
ArrayList<String> sms_id = new ArrayList<String>();
ArrayList<String> sms_num = new ArrayList<String>();
ArrayList<String> sms_Name = new ArrayList<String>();
ArrayList<String> sms_dt = new ArrayList<String>();
ArrayList<String> sms_body = new ArrayList<String>();
// private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri myMessage = Uri.parse("content://sms/");
ContentResolver cr = this.getContentResolver();
Cursor c = cr.query(myMessage, new String[] { "_id", "address", "date",
"body", "read" }, "address = '+9180009'", null, null);
startManagingCursor(c);
getSmsLogs(c, MainActivity.this);
}
public void getSmsLogs(Cursor c, Context con) {
if (sms_num.size() > 0) {
sms_id.clear();
sms_num.clear();
sms_Name.clear();
sms_body.clear();
sms_dt.clear();
}
try {
if (c.moveToFirst()) {
do {
if (c.getString(c.getColumnIndexOrThrow("address")) == null) {
c.moveToNext();
continue;
}
String Number = c.getString(
c.getColumnIndexOrThrow("address")).toString();
String _id = c.getString(c.getColumnIndexOrThrow("_id"))
.toString();
String dat = c.getString(c.getColumnIndexOrThrow("date"))
.toString();
String Body = c.getString(c.getColumnIndexOrThrow("body"))
.toString();
Log.e("Body-->", "" + Body);
sms_id.add(_id);
sms_num.add(Number);
sms_body.add(Body);
} while (c.moveToNext());
}
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
sMS本体のログを確認してください:以下の権限を使用する必要があります
<uses-permission Android:name="Android.permission.READ_SMS" />
ループにifステートメントを追加して、選択した番号と一致させる
String selectedNumber;
// copy the selected number to selectedNumber
do {
if(cursor.getString( indexAddr ).equals(selectedNumber))
{
String str = "Sender: " + cursor.getString( indexAddr ) + "\n" + cursor.getString( indexBody );
smsList.add( str );
}
}
while( cursor.moveToNext() );
ここでは、選択した番号と一致する番号からのメッセージのみがsmsListに追加されます。古い質問ですが、誰かのお役に立てば幸いです
特定の番号からのみメッセージを読みたい場合は、どういうわけかデータをフィルタリングする必要があります。
この例では、カーソルをフィルターして並べ替えます。
selection = "_id = " + 15;
Cursor curSms = context.getContentResolver().query(smsUri, null, selection, null, "date ASC");
public class IncomingSms extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
final Bundle bundle = intent.getExtras();
try {
if (bundle != null)
{
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj .length; i++)
{
SmsMessage currentMessage =
SmsMessage.createFromPdu((byte[])pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber ;
String message = currentMessage .getDisplayMessageBody();
try
{
if (senderNum .equals("TA-DOCOMO"))
{
Otp Sms = new Otp();
Sms.recivedSms(message );
}
}
catch(Exception e){}
}
}
} catch (Exception e)
{
}
}
}
詳細については、ここをクリックしてください http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html