Android Kitkat及以上版本的传入消息接收器和通知默认系统消息应用程序
大家好,我正在开发一个短信应用程序,并遵循谷歌博客的所有指示 它工作得很好。但当我的应用程序作为默认消息应用程序工作时,我有一个问题。我想将消息保存在我的应用程序数据库以及设备默认消息应用程序数据库中,以便当设备消息应用程序转为默认时,也可以在那里看到所有消息 关键是当我将我的应用程序用作默认应用程序时,如何通知默认消息应用程序保存消息 请帮忙!对不起,英语不好 #更新1 为了保存在默认数据库中,我使用以下代码Android Kitkat及以上版本的传入消息接收器和通知默认系统消息应用程序,android,broadcastreceiver,message,Android,Broadcastreceiver,Message,大家好,我正在开发一个短信应用程序,并遵循谷歌博客的所有指示 它工作得很好。但当我的应用程序作为默认消息应用程序工作时,我有一个问题。我想将消息保存在我的应用程序数据库以及设备默认消息应用程序数据库中,以便当设备消息应用程序转为默认时,也可以在那里看到所有消息 关键是当我将我的应用程序用作默认应用程序时,如何通知默认消息应用程序保存消息 请帮忙!对不起,英语不好 #更新1 为了保存在默认数据库中,我使用以下代码 public class SmsReceiver extends Broadcast
public class SmsReceiver extends BroadcastReceiver {
private Context context;
private String msg_from;
//private MessageDataBaseAdapter messageDataBaseAdapter;
private String msgBody;
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;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
if (intent.getAction().equals("android.provider.Telephony.SMS_DELIVER")) {
HideSMSToast.showShortToast("Your Message Hasbeen received");
Bundle bundle = intent.getExtras(); // ---get the SMS message passed
// Get ContentResolver object for pushing encrypted SMS to incoming folder
ContentResolver contentResolver = context.getContentResolver(); // in---
SmsMessage[] msgs = null;
if (bundle != null) {
// ---retrieve the SMS message received---
try {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
// String strMessageFrom =
// bundle.getDisplayOriginatingAddress();
for (int i = 0; i < msgs.length; i++) {
//Calendar c = Calendar.getInstance();
// System.out.println("Current time => "+c.getTime());
// SCSLToast.showShortToast(c.getTime().toString());
//SimpleDateFormat date = new SimpleDateFormat(
// "dd-MMM-yyyy hh:mm:ss a");
//String formattedDate = date.format(c.getTime());
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
msg_from = msgs[i].getOriginatingAddress();
msgBody = msgs[i].getMessageBody();
//Db operation
saveSmsDataToDefaulDB( contentResolver, msgs[i] );
}
///
} catch (Exception e) {
// Log.d("Exception caught",e.getMessage());
//messageDataBaseAdapter.close();
}
}
}
}
private void saveSmsDataToDefaulDB( ContentResolver contentResolver, SmsMessage sms )
{
// Create SMS row
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);
contentResolver.insert( Uri.parse(SMS_URI), values);
HideSMSToast.showShortToast("Content written in default message app db");
}}
我认为它应该起作用,创建一个新类
public class IncomingSms extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the 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();
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
// Show Alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context,
"senderNum: "+ senderNum + ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
public class IncomingSms扩展广播接收器{
//获取SmsManager的对象
final smsmsmanager sms=smsmsmanager.getDefault();
公共void onReceive(上下文、意图){
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i
}
我的意思是这里的代码是用toast打印的。。但是一旦你收到了消息,并且发送者没有,就把它发送给你的数据库
希望有帮助…此链接可能对您有所帮助:@RajanBhavsar谢谢您的评论,但这不是我想要的,我已保存在我的应用程序数据库中。感谢您的回答,但我以前已经这样做过,但我也想更新系统默认消息数据库,以便在系统默认消息应用程序转到默认消息应用程序以侦听消息时使用它显示所有数据..我认为系统默认消息db会自动更新。。但不确定是的,但不适用于Kitkat及以上版本,因为现在只有一个应用程序可以监听谷歌博客中提到的输入消息
public class IncomingSms extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the 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();
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
// Show Alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context,
"senderNum: "+ senderNum + ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}