当前位置:首页 > 行业动态 > 正文

关于Android系统读短信权限的疑问

在Android中读取短信需要申请 READ_SMS权限,并在代码中动态请求该 权限

Android读取短信权限详解

一、权限声明

要在Android应用中读取短信,首先需要在AndroidManifest.xml文件中声明相关权限,通常需要以下两个权限:

1、android.permission.READ_SMS:用于读取短信内容。

2、android.permission.RECEIVE_SMS:用于接收短信广播,以便实时监听新收到的短信。

示例代码如下:

<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

二、运行时权限请求(Android 6.0及以上)

从Android 6.0(API级别23)开始,系统引入了运行时权限机制,要求在应用运行时动态申请权限,以下是请求和处理短信读取权限的步骤:

1、检查权限是否已授权

使用ContextCompat.checkSelfPermission()方法检查应用是否已经获得了短信读取权限。

   if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
       // 权限未授权,请求权限
   } else {
       // 权限已授权,可以直接读取短信
       readSms();
   }

2、请求权限

如果权限未授权,使用ActivityCompat.requestPermissions()方法向用户请求权限。

关于Android系统读短信权限的疑问

   ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_SMS}, MY_PERMISSIONS_REQUEST_READ_SMS);

MY_PERMISSIONS_REQUEST_READ_SMS是一个自定义的权限请求码,用于区分不同的权限请求。

3、处理权限请求结果

重写onRequestPermissionsResult()方法,处理用户的授权结果。

   @Override
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
       switch (requestCode) {
           case MY_PERMISSIONS_REQUEST_READ_SMS: {
               if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   // 授权成功,读取短信
                   readSms();
               } else {
                   // 授权失败,提示用户
                   Toast.makeText(this, "需要短信读取权限", Toast.LENGTH_SHORT).show();
               }
               return;
           }
       }
   }

三、读取短信数据

在获得权限后,可以通过以下方式读取短信:

1、使用ContentResolver查询短信

通过ContentResolver查询短信数据库中的短信内容,短信数据库的URI主要有以下几种:

content://sms/:所有短信。

关于Android系统读短信权限的疑问

content://sms/inbox:收件箱。

content://sms/sent:已发送。

content://sms/draft:草稿。

content://sms/outbox:发件箱。

content://sms/failed:发送失败。

content://sms/queued:待发送列表。

示例代码如下:

关于Android系统读短信权限的疑问

   private void readSms() {
       Uri uri = Uri.parse("content://sms/inbox");
       String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
       Cursor cur = getContentResolver().query(uri, projection, null, null, "date desc");
       if (cur.moveToFirst()) {
           String address = cur.getString(cur.getColumnIndex("address"));//发信人号码
           String body = cur.getString(cur.getColumnIndex("body"));//短信内容
           String date = cur.getString(cur.getColumnIndex("date"));//时间
           Log.i("SMS", "Address: " + address);
           Log.i("SMS", "Body: " + body);
           Log.i("SMS", "Date: " + date);
       }
       cur.close();
   }

2、使用SmsManager读取SIM卡上的短信

SmsManager类提供了一些方法来管理短信,但通常不直接用于读取短信内容,不过,可以使用SmsManager.getAllMessagesFromIcc()方法读取SIM卡上的所有短信。

   SmsManager smsManager = SmsManager.getDefault();
   List<SmsMessage> messages = smsManager.getAllMessagesFromIcc();   for (SmsMessage message : messages) {
       String sender = message.getDisplayOriginatingAddress();
       String content = message.getDisplayMessageBody();
       Log.d("Sms", "Sender: " + sender + ", Content: " + content);
   }

四、相关问题与解答

1、问题:为什么在Android 6.0及以上版本需要动态请求权限?

回答:在Android 6.0之前,应用安装时会一次性请求所有需要的权限,这可能导致用户在不知情的情况下授予过多权限,影响隐私安全,为了改善这一状况,Android 6.0引入了运行时权限机制,要求应用在需要时才请求权限,提高了用户对应用权限的控制能力。

2、问题:如果用户拒绝了短信读取权限请求,应用还能继续运行吗?

回答:是的,用户拒绝权限请求后,应用仍然可以继续运行,但将无法执行需要该权限的功能,如读取短信,在这种情况下,应用应该向用户解释为何需要该权限,并在适当的时候再次请求权限,或者提供替代功能以避免影响用户体验。