How can I read SMS messages from the device programmatically in Android?

后端 未结 11 2500
情深已故
情深已故 2020-11-22 02:48

I want to retrieve the SMS messages from the device and display them?

11条回答
  •  南方客
    南方客 (楼主)
    2020-11-22 03:14

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            final String myPackageName = getPackageName();
            if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {
    
                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
                startActivityForResult(intent, 1);
            }else {
                List lst = getAllSms();
            }
        }else {
            List lst = getAllSms();
        }
    

    Set app as default SMS app

        @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                final String myPackageName = getPackageName();
                if (Telephony.Sms.getDefaultSmsPackage(mActivity).equals(myPackageName)) {
    
                    List lst = getAllSms();
                }
            }
        }
    }
    }
    

    Function to get SMS

    public List getAllSms() {
        List lstSms = new ArrayList();
        Sms objSms = new Sms();
        Uri message = Uri.parse("content://sms/");
        ContentResolver cr = mActivity.getContentResolver();
    
        Cursor c = cr.query(message, null, null, null, null);
        mActivity.startManagingCursor(c);
        int totalSMS = c.getCount();
    
        if (c.moveToFirst()) {
            for (int i = 0; i < totalSMS; i++) {
    
                objSms = new Sms();
                objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
                objSms.setAddress(c.getString(c
                        .getColumnIndexOrThrow("address")));
                objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
                objSms.setReadState(c.getString(c.getColumnIndex("read")));
                objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
                if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                    objSms.setFolderName("inbox");
                } else {
                    objSms.setFolderName("sent");
                }
    
                lstSms.add(objSms);
                c.moveToNext();
            }
        }
        // else {
        // throw new RuntimeException("You have no SMS");
        // }
        c.close();
    
        return lstSms;
    }
    

    Sms class is below:

    public class Sms{
    private String _id;
    private String _address;
    private String _msg;
    private String _readState; //"0" for have not read sms and "1" for have read sms
    private String _time;
    private String _folderName;
    
    public String getId(){
    return _id;
    }
    public String getAddress(){
    return _address;
    }
    public String getMsg(){
    return _msg;
    }
    public String getReadState(){
    return _readState;
    }
    public String getTime(){
    return _time;
    }
    public String getFolderName(){
    return _folderName;
    }
    
    
    public void setId(String id){
    _id = id;
    }
    public void setAddress(String address){
    _address = address;
    }
    public void setMsg(String msg){
    _msg = msg;
    }
    public void setReadState(String readState){
    _readState = readState;
    }
    public void setTime(String time){
    _time = time;
    }
    public void setFolderName(String folderName){
    _folderName = folderName;
    }
    
    }
    

    Don't forget to define permission in your AndroidManifest.xml

    
    

提交回复
热议问题