无法将短信发送到android studio中的已保存号码

问题描述 投票:0回答:2

我是Android应用程序制作中的新手,正在努力寻找一种将SMS发送到已使用SharedPreferences保存的电话号码的方法。在MainActivity中,我已将电话号码和用户名保存在名为savedata的文件中。然后在另一个名为SMS的活动中,我试图在单击标记为sendbutton的按钮之后将SMS发送到保存的电话号码。在Android清单中我已经提到SEND_SMS权限。

构建和安装成功,但应用程序崩溃。请帮助并提前致谢。这是代码:

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.33128633-28633 / com.example.testing E / AndroidRuntime:致命异常:主要流程:com.example.testing,PID:28633java.lang.SecurityException:用户10086和当前进程都没有android.permission.READ_PHONE_STATE。在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.SmsManager.sendTextMessageInternal(SmsManager.java:329)在android.telephony.SmsManager.sendTextMessage(SmsManager.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)

android smsmanager android-securityexception
2个回答
0
投票
[您的应用似乎没有发送短信的权限。请在清单文件中添加权限


0
投票
您可以使用Dexter来请求两个权限

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()

© www.soinside.com 2019 - 2024. All rights reserved.