Android——SMS接收發短信與運行權限


好久沒寫了,最近學習Android的相關知識,包括UI組件與布局、Activity生命周期等,而這次要講的是,Broadcast Receiver的相關知識,主要是接收發短信,SmsManagerSmsManages的使用。還有就是這里涉及到的權限問題,在清單文件中加入相關的權限,還有就是運行權限。具體請看下面例子:

發短信(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方法如上

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM