Android的基本常用的短信操作
1、調(diào)用系統(tǒng)發(fā)送短信界面(傳入手機號碼+短信內(nèi)容)
2、隱藏發(fā)送短信(指定號碼指定內(nèi)容)(這里隱藏只是沒有反寫入數(shù)據(jù)庫)
3、獲得收件箱接收到的短信
4、Android屏蔽新短信通知提示信息:(ContentObserver)
4、刪除剛接收到的短信:
? ? ? A)、帶提示刪除
? ? ? ? B)、無新短信通知=刪除短信
所用到的相關(guān)數(shù)據(jù)類:
Intent、SmsManager、BroadcastReceiver、ContentObserver、Bundle
涉及動作(Action):
android.provider.Telephony.SMS_RECEIVED
涉及權(quán)限:
<!-- 短信 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
1、調(diào)用系統(tǒng)發(fā)送短信界面(傳入手機號碼+短信內(nèi)容)
(直接使用Intent 意圖執(zhí)行系統(tǒng)的sms即可--同理這里可以使用該方式調(diào)用手機發(fā)送郵件等)源碼如下:
public void SendSMS( String aContent ){
// 新建smsto意圖
Intent iIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:158********"));//傳入要發(fā)送的地址
// 設(shè)置短信內(nèi)容
iIntent.putExtra("sms_body", aContent);//設(shè)置傳遞的信息內(nèi)容
// 啟動短信服務(wù)內(nèi)容
aContent.startActivity(iIntent);//直接打開意圖即可
}
2、隱藏發(fā)送短信(指定號碼指定內(nèi)容)(這里隱藏只是沒有反寫入數(shù)據(jù)庫)
創(chuàng)建發(fā)送自己的短信需要用到短信管理類SmsManager,使用它的sendTextMessage方法即可實現(xiàn)程序發(fā)送:
public void SendSMSHide(String aPhoneNUM, String aContent){
// 創(chuàng)建一個默認的SmsManager。
SmsManager aSmsManager = SmsManager.getDefault();
// 發(fā)送信息的intent參數(shù)。
String aSent = "SMS_SENT";
// 信息反饋的intent參數(shù)。
String aDelivered = "SMS_DELIVERED";
// 創(chuàng)建發(fā)送新信息的PendingIntent對象
PendingIntent aSentPI = PendingIntent.getBroadcast(this, 0, new Intent(aSent), 0);
// 信息反饋的PendingIntent。
PendingIntent aDeliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(aDelivered), 0);
aSmsManager .sendTextMessage(aPhoneNUM, null, aContent, aSentPI, aDeliveredPI);//發(fā)送短信(還可以發(fā)送彩信等)
//debuge
if(BOOL_ISDEBUGE){
Toast.makeText(aContent,"短信送出成功!!",Toast.LENGTH_SHORT ).show();
}
}
3、獲得收件箱接收到的短信
A)、方法一:
通過繼承BroadcastReceiver服務(wù),處理onReceive函數(shù),判斷接收到的動作為SMS_RECEIVED
我將其封裝在ReceiveSMS(aContext, aIntent);函數(shù)中只需要在onReceive()函數(shù)中調(diào)用即可!
public void ReceiveSMS(Context aContext, Intent aIntent) {
if (aIntent.getAction().equals(SSTR_SMSACTION)) { // 監(jiān)聽SMS_RECEIVED消息
Bundle iBundle = aIntent.getExtras(); // 獲取Intent數(shù)據(jù)
if (iBundle != null) {
Object[] iObject = (Object[]) iBundle.get("pdus"); // 獲取pdus對象
SmsMessage iMsg = SmsMessage.createFromPdu((byte[]) iObject[0]); // 初始化信息對象
m_strSMSAddress = iMsg.getDisplayOriginatingAddress(); // 獲取信息發(fā)送人
m_strSMSText = iMsg.getDisplayMessageBody(); // 獲取信息內(nèi)容
//to do your things
Toast.makeText(aContext, "Address = "+m_strSMSAddress+"\nCountent = "+m_strSMSText, Toast.LENGTH_LONG).show();
}
}
}
B)、方法二:繼承ContentObserver類在onChange中調(diào)用(注冊監(jiān)聽sms即可)
? ? ? this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);?
4、Android屏蔽新短信通知提示信息:(ContentObserver)
大致思路先從收件箱獲得指定未讀短信,在執(zhí)行通知前更改為已讀,執(zhí)行SQL的updata即可
? ? ? ? @Override?
? ? ? ? public void onChange(boolean selfChange) {?
? ? ? ? ? ? super.onChange(selfChange);?
? ? ? ? ? ? //讀取收件箱中指定號碼的短信?
cursor = managedQuery(Uri.parse("content://sms/inbox"),
? ? ? ? ? ? new String[]{"_id", "address", "read"},
? ? ? ? ? ? "read = 0", null,
? ? ? ? ? ? "date desc");
? ? ? cursor.moveToFirst();?
? ? ? ? for(int i =0;i<cursor.getCount();++i)
? ? ? ? ? ? {
? ? ? ? ? ? Log.i("address","address = "+cursor.getLong(1));
? ? ? ? ? ? if(cursor.getString(1).indexOf("136******")>=0)
? ? ? ? ? ? {//這里運用indexof方式查找,并沒有用比較因為系統(tǒng)會有國際號碼
? ? ? ? ? ? ? ? ContentValues values = new ContentValues();?
? ? ? ? ? ? ? ? values.put("read", "1");? ? ? ? //修改短信為已讀模式?
? ? ? ? ? ? ? ? ? ? getContentResolver().update(Uri.parse("content://sms/inbox"), values, " _id=?", new String[]{""+cursor.getInt(0)});?
? ? ? ? ? break;//這里如果跳出就只能更改一條(剛收到的可以這樣實現(xiàn)而且手機上方將不再有短信提示)
? ? ? ? ? ? }
? ? ? ? ? ? cursor.moveToNext();
? ? ? ? ? ? }
? ? ? ? }
5、刪除剛接收到的短信:
A)、帶提示刪除(這樣不知到有什么用。呵呵。寫出來分享)
短信能刪除但是當(dāng)手機接收到短信時還會在手機通知里面顯示給用戶
繼承BroadcastReceiver類,首先獲得會話id在執(zhí)行數(shù)據(jù)庫刪除即可
I、獲得會話id:
(思路這樣還可以簡潔的-網(wǎng)上找的大家也可以用上面的managedQuery方法)
private long getThreadId(Context aContext) {
long threadId = 0;
String SMS_READ_COLUMN = "read";
String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
String SORT_ORDER = "date DESC";
int count = 0;
Cursor cursor = aContext.getContentResolver().query(
Uri.parse("content://sms/inbox"),new String[] { "_id", "thread_id", "address", "person", "date",
"body" },WHERE_CONDITION,null,SORT_ORDER);
if (cursor != null) {try {count = cursor.getCount();
if (count > 0) {
cursor.moveToFirst();
threadId = cursor.getLong(1);}
} finally {cursor.close();}}
Log.i("threadId", String.valueOf(threadId));
return threadId;}
II、執(zhí)行刪除:
這里我們可以在BroadcastReceiver的onReceive函數(shù)里面直接調(diào)用刪除方法如下:
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
//無條件刪除id所有會話,第二個參數(shù)可以添加條件
aContext.getContentResolver().delete(mUri, null, null);
但 是這里你會發(fā)現(xiàn)你刪除的并不是你剛才發(fā)送的信息,而是你上一次發(fā)送的信息的所有,這里是為什么呢,原因是我們剛剛監(jiān)聽的收件箱的時候當(dāng)前會話是還沒有來得 及創(chuàng)建的,所以刪除會話也是刪除的以前的,所以這里我們需要時間。可以用如下方式來實現(xiàn):這樣就會成功了。但是這種方式短信通知依然存在
new Thread(){
public void run(){
try {sleep(600);//等待一段時間刪除
} catch (InterruptedException e) {
e.printStackTrace();}
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
aContext.getContentResolver().delete(mUri, null, null);
}}.start();
轉(zhuǎn)載于:https://www.cnblogs.com/android-blogs/p/4959706.html
總結(jié)
以上是生活随笔為你收集整理的Android的基本常用的短信操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2013+qt-vs-addin-1
- 下一篇: eclipse 设置 默认编码为 utf