无法向android studio中保存的号码发送短信

无法向android studio中保存的号码发送短信,android,smsmanager,android-securityexception,Android,Smsmanager,Android Securityexception,我是android应用程序制作的新手,正在努力寻找一种方法,将短信发送到使用SharedReferences保存的电话号码。在主要活动中,我将电话号码和用户名保存在一个名为saveddata的文件中。然后在另一个名为SMS的活动中,我尝试在单击标记为sendbutton的按钮后向保存的电话号码发送SMS。在我提到的android清单中 发送短信许可 构建和安装已成功,但应用程序正在崩溃。请提前帮助和感谢。 代码如下: public class SMS extends AppCompatActiv

我是android应用程序制作的新手,正在努力寻找一种方法,将短信发送到使用SharedReferences保存的电话号码。在主要活动中,我将电话号码和用户名保存在一个名为saveddata的文件中。然后在另一个名为SMS的活动中,我尝试在单击标记为sendbutton的按钮后向保存的电话号码发送SMS。在我提到的android清单中 发送短信许可

构建和安装已成功,但应用程序正在崩溃。请提前帮助和感谢。 代码如下:

public class SMS extends AppCompatActivity {
    private TextView header;
    private Button sendbutton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        header = (TextView) findViewById(R.id.headerText);
        sendbutton = (Button) findViewById(R.id.button);
        sendbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int permissionCheck = ContextCompat.checkSelfPermission(SMS.this, Manifest.permission.SEND_SMS);


                if( permissionCheck == PackageManager.PERMISSION_GRANTED) {
                    MyMessage();
                } else {
                    ActivityCompat.requestPermissions(SMS.this, new String[]{Manifest.permission.SEND_SMS}, 0);
                }

            }


        });


    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 0:
                if (grantResults.length >= 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    MyMessage();
                } else {
                    Toast.makeText(getApplicationContext(), "Permission needed to send SMS", Toast.LENGTH_SHORT).show();
                }

                break;
        }

    }

    private void MyMessage() {
        //SharedPreferences result = getSharedPreferences("saveddata", MODE_PRIVATE);
        SharedPreferences result = getSharedPreferences("saveddata", MODE_PRIVATE);
        String savedname = result.getString("NAME", "name not found");
        String savedphone = result.getString("PHONE", "phone not found");

        String message = "I need help" + " " + savedname ;
        if (!savedphone.equals("")) {

            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(savedphone, null, message, null, null);
            Toast.makeText(getApplicationContext(), "SMS sent", Toast.LENGTH_SHORT).show();

        } else {
            Toast.makeText(getApplicationContext(), "Phone number or name n.a.", Toast.LENGTH_SHORT).show();
        }
    }
}
按下发送按钮后,我在logcat中收到此消息:

---------坠机开始2020-02-12 09:11:20.331 28633-28633/com.example.testing E/AndroidRuntime:致命异常: 主要的 进程:com.example.testing,PID:28633 java.lang.SecurityException:用户10086和当前进程都没有android.permission.READ\u PHONE\u状态。 在android.os.Parcel.readException(Parcel.java:1942) 在android.os.Parcel.readException(Parcel.java:1888) 位于com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:789) 位于android.telephony.smsmsmanager.sendTextMessageInternal(SmsManager.java:329) 位于android.telephony.smsmsmanager.sendTextMessage(smsmsmanager.java:312) 在com.example.testing.SMS.MyMessage(SMS.java:77)上 com.example.testing.SMS.access$000(SMS.java:18) 位于com.example.testing.SMS$1.onClick(SMS.java:36) 在android.view.view.performClick上(view.java:6256) 在android.view.view$PerformClick.run(view.java:24701) 位于android.os.Handler.handleCallback(Handler.java:789) 位于android.os.Handler.dispatchMessage(Handler.java:98) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6541) 位于java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:240) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)


您的应用似乎没有发送短信的权限。请在清单文件中添加该权限

您可以使用来请求这两个权限

build.gradle
中添加:

implementation 'com.karumi:dexter:5.0.0'
并在活动中使用它作为:

val requiredPermissions =listOf(Manifest.permission.SEND_SMS,
                Manifest.permission.READ_PHONE_STATE)

Dexter.withActivity(this)
     .withPermissions(requiredPermissions)
     .withListener(object : MultiplePermissionsListener {
        override fun onPermissionRationaleShouldBeShown(
             permissions: MutableList<PermissionRequest>?,
                    token: PermissionToken?
             ) {
                    /* ... */
                }

        override fun onPermissionsChecked(report: MultiplePermissionsReport) = 
             if (report.isAnyPermissionPermanentlyDenied) {
                toast("You should grant all permissions") 
             } else {
                toast("All permissions granted now send sms here")
              }).check()

val requiredpowpermissions=listOf(Manifest.permission.SEND_SMS,
清单。权限。读取(电话状态)
Dexter.withActivity(本)
.withPermissions(必需的权限)
.withListener(对象:MultiplePermissionsListener{
覆盖权限上的乐趣合理应显示(
权限:可变列表?,
令牌:许可令牌?
) {
/* ... */
}
覆盖onPermissionsChecked(报告:MultiplePermissionsReport)=
如果(report.isanypermissionpermissionpermanentlydenied){
toast(“您应该授予所有权限”)
}否则{
toast(“现在授予的所有权限在此处发送短信”)
}).检查()

您好,您能发布坠机消息吗?您好。我已在按下“发送”按钮后添加了logcat消息。感谢您的回复。您的问题解决了吗?如果需要两个权限,我如何使用switch?一个用于读取电话状态,另一个用于发送短信?谢谢,请帮助。我的清单文件已被删除,很抱歉,我收到了使用Dexter代码时出错很多。我在build.gradle模块应用程序的dependencies下添加了Dexter实现。然后在SMS.java中,当我复制代码时,它无法解析Dexter、val、MultiplePermissionsListener等。我束手无策。