简体   繁体   English

短信权限

[英]SMS Permissions

I am building an Android app via android studio.我正在通过 android studio 构建一个 Android 应用程序。 One major feature of the app is sending SMS but I cannot seem to get it to run correctly on different devices due to permission errors.I tried to eliminate this issue by prompting for permissions when the user logs in but this worked on API version 13 and failed on 26,I tried it with build.versioncode.o.该应用程序的一个主要功能是发送短信,但由于权限错误,我似乎无法让它在不同的设备上正确运行。我试图通过在用户登录时提示权限来消除这个问题,但这在 API 版本 13 和26 失败,我用build.versioncode.o.试过了build.versioncode.o. but his also failed.但他的也失败了。 What is the correct way to do this and to check permissions each time a SMS is sent?(note sms are sent from many different functions throughout the app.执行此操作并在每次发送短信时检查权限的正确方法是什么?(注意短信是从整个应用程序的许多不同功能发送的。

I also just got this error hen sending message我在发送消息时也刚收到此错误

java.lang.SecurityException: Neither user 10205 nor current process has android.permission.READ_PHONE_STATE.

Request permission on log in登录时请求权限

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void getPermissionToReadSMS() {
    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
        if (shouldShowRequestPermissionRationale(
                android.Manifest.permission.READ_SMS)) {
            Toast.makeText(this, "Please allow permission!", Toast.LENGTH_SHORT).show();
        }
        requestPermissions(new String[]{android.Manifest.permission.READ_SMS},
                REQUEST_READ_SMS);
    }
}

Method snippet that sends method发送方法的方法片段

    SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(testContact.getNumber(), null, "SENT MESSAGE" + message, sentPending, deliveredPending);

App Manifest应用清单

 <!-- grant permission to uses in build sms service -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission-group.SMS" />

For checkPermission to send SMS, you will need to add <uses-permission android:name="android.permission.SEND_SMS" /> permission and the below code for >=23 api 对于checkPermission发送短信,您需要添加<uses-permission android:name="android.permission.SEND_SMS" />权限和以下代码,用于> = 23 api

 protected void sendSMS() {
     if (ContextCompat.checkSelfPermission(this,
             Manifest.permission.SEND_SMS)
             != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                   Manifest.permission.SEND_SMS)) {
                } else {
                   ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.SEND_SMS},
                      PERMISSION_REQUEST_SEND_SMS);
                }
          }
}
 @Override
   public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
      switch (requestCode) {
         case PERMISSION_REQUEST_SEND_SMS: {
            if (grantResults.length > 0
               && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  SmsManager smsManager = SmsManager.getDefault();
                  smsManager.sendTextMessage(phoneNo, null, message, null, null);
                  Toast.makeText(getApplicationContext(), "SMS sent successfully.", 
                     Toast.LENGTH_LONG).show();
            } else {
               Toast.makeText(getApplicationContext(), 
                  "SMS faild", Toast.LENGTH_LONG).show();
               return;
            }
         }
      }

   } 
 //You should declare this in your project
private static String[] PERMISSIONS_STORAGE = {

            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.READ_SMS,
            Manifest.permission.RECEIVE_SMS,
            Manifest.permission.SEND_SMS,

    };

//and call verifymethod where you want verifyStoragePermissions(Activity_home.this); //并在您要验证的地方调用verifymethod(验证存储权限(Activity_home.this);

//and the verifyStoragePermissions methode is  
 public static void verifyStoragePermissions(Activity activity) {
        int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE);
        int smspermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_SMS);
        int smspermission1 = ActivityCompat.checkSelfPermission(activity, Manifest.permission.RECEIVE_SMS);
        int smssendpermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.SEND_SMS);

        if (readPermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED || smspermission != PackageManager.PERMISSION_GRANTED || smspermission1 != PackageManager.PERMISSION_GRANTED  || smssendpermission != PackageManager.PERMISSION_GRANTED) {userActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE );
        }
    }

I'm sending it from a fragment.我从一个片段发送它。 The solution given by @Android Team above works for me for the first time only.上面@Android Team 给出的解决方案仅适用于我第一次。 Apparently if the app has required permission it doesnt call onRequestPermissionsResult.显然,如果应用程序具有所需的权限,它不会调用 onRequestPermissionsResult。

Using the following code (else portion with log msg "Have permission.." in the onlclick handler is required for my app to work).使用以下代码(我的应用程序需要在 onlclick 处理程序中使用 log msg "Have permission.." 的其他部分才能工作)。 I'm using Android 11 device.我正在使用 Android 11 设备。

       if (ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
        //if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
        if (shouldShowRequestPermissionRationale(
                Manifest.permission.SEND_SMS)) {
        } else {
            //ActivityCompat.requestPermissions(getActivity(),
            requestPermissions(
                    new String[]{Manifest.permission.SEND_SMS},
                    MY_PERMISSIONS_REQUEST_SEND_SMS);
        }
    } else {
        Log.i("smsB", "Have permission... send the sms now");
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, message, null, null);
        Toast.makeText(getContext(), "SMS sent.",
                Toast.LENGTH_LONG).show();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM