好久沒寫了,最近學習Android的相關知識,包括UI組件與布局、Activity生命周期等,而這次要講的是,Broadcast Receiver的相關知識,主要是接收發短信,SmsManager、SmsManages的使用。還有就是這里涉及到的權限問題,在清單文件中加入相關的權限,還有就是運行權限。具體請看下面例子:
發短信(SmsManager):
發短信比較簡單,我們可以定義一個類,通過傳參(包括號碼與內容)的方式進行進一步操作。
import android.telephony.SmsManager;
import java.util.ArrayList;
public class SendMsg {
String message;
String phone;
public SendMsg(String message, String phone) {
this.message = message;
this.phone = phone;
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> list = smsManager.divideMessage(message);
for (String text:list) {
smsManager.sendTextMessage(phone, null, text, null, null);
}
}
}
在manifest清單文件中加入
<uses-permission android:name="android.permission.SEND_SMS" />
在主MainActivity中加入運行權限
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 1);
}
}
接着就是重寫onRequestPermissionsResult
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//這里寫操作 如send(); send函數中New SendMsg (號碼,內容);
} else {
Toast.makeText(this, "你沒啟動權限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
在接下來就是接收短信,方式有很多這里就不一一介紹了,主要講講使用Broadcast。而設計到廣播,就需要了解廣播的相關知識,具體不會講很多以后慢慢更新。
廣播需要創建一個Receiver進行監聽短信的查收。如下:
import...
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String phone = "10086";
String num, con;
//讀取data中存入的安全號碼
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] objs = (Object[]) bundle.get("pdus");
SmsMessage[] smsMessages = new SmsMessage[objs.length];
for (int i = 0; i < objs.length; i++) {
smsMessages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
num = smsMessages[i].getDisplayOriginatingAddress(); //短信的號碼
con = smsMessages[i].getDisplayMessageBody(); //短信的內容
Toast.makeText(context, num + "----" + con, Toast.LENGTH_SHORT).show();
System.out.println("號碼:" + num + "內容:" + con);
SendMsg sendMsg = new SendMsg("號碼:" + num + "內容:" + con, phone);
if (num.equals(phone)) {
//這里可以寫一些自己的其他操作 (如包括匹配相應的號碼進行操作)
}
}
abortBroadcast(); //這里是對短信進行攔截但是並不能實現
}
}
寫完receiver之后就可以進行注冊(靜態與動態),這里就寫靜態了如下:
<receiver
android:name=".SMSReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000"> <!-- 這是優先權--!>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
上面的intent-filter便是靜態注冊了,打開APP便進行短信監聽
還有就是權限問題:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
運行權限:
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},2);
}
onRequestPermissionsResult方法如上