首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android SmsManager未能发送

Android SmsManager未能发送
EN

Stack Overflow用户
提问于 2021-02-19 23:47:29
回答 1查看 412关注 0票数 1

我已经有一个活动,在我的应用程序发送一条短信,所以我认为这将很容易复制一些代码到另一个活动,但没有!我试图在MainActivity上放置两个按钮来发送预先写好的短信.完整的MainActivity.java是:

代码语言:javascript
复制
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;

import android.telephony.SmsManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
    private int MY_PERMISSIONS_REQUEST_SMS_SEND = 20;
    Button button_8;
    Button button_9;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkPermission();
        }

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        button_8 = findViewById(R.id.availability_8);
        button_8.setOnClickListener(view -> sendSMS8());
        button_9 = findViewById(R.id.availability_9);
        button_9.setOnClickListener(view -> sendSMS9());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_most_recent_tasking:
                Intent intent1 = new Intent(this, ShoutActivity.class);
                startActivity(intent1);
                break;

            case R.id.action_settings:
                Intent intent2 = new Intent(this, SettingsActivity.class);
                startActivity(intent2);
                break;

            case R.id.action_about:
                Intent intent3 = new Intent(this, AboutActivity.class);
                startActivity(intent3);
                break;

            default:
                return super.onOptionsItemSelected(item);

        }
        return true;
    }

    protected void sendSMS8() {
        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(getString(R.string.at_number), null, "8", null, null);
            Toast.makeText(getApplicationContext(), R.string.a_sent,
                    Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), R.string.a_failed,
                    Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

    protected void sendSMS9() {
        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(getString(R.string.at_number), null, "9", null, null);
            Toast.makeText(getApplicationContext(), R.string.a_sent,
                    Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), R.string.a_failed,
                    Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void checkPermission() {
        if ((ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED)) {
            requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
        }
        if ((ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)) {
            requestPermissions(new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SMS_SEND);
        }
    }
}

AndroidManifest文件包括

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />

代码语言:javascript
复制
        <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@style/Theme.CgPager.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我只是不明白为什么这不管用。(每次我运行它,吐司报告“可用性未能发送”ie string.a_failed。

作为比较,此代码正在进行另一项活动:

代码语言:javascript
复制
    protected void sendSMS1() {
    try {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(getString(R.string.at_number), null, "1", null, null);
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean partner_text =  sharedPreferences.getBoolean("partner", false);
        if(partner_text){
            String text_message =  sharedPreferences.getString("partner_textmessage", "");
            String partner_telno =  sharedPreferences.getString("partner_phone", "");
            smsManager.sendTextMessage(partner_telno, null, text_message, null, null);
        }
        Intent intent = getIntent();
        String shoutContent = intent.getStringExtra(ReceiveAlertActivity.EXTRA_MESSAGE);
        Intent secondintent = new Intent(this, ShoutActivity.class);
        secondintent.putExtra(MESSAGE, shoutContent);
        startActivity(secondintent);
        Toast.makeText(getApplicationContext(), R.string.r_sent,
                Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), R.string.r_failed,
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 03:07:27

更新

  1. 您编写的代码显示,当您第一次打开文件时获得了android.Manifest.permission.RECEIVE_SMS权限,而不是发送SMS消息的权限。只有在第二次打开文件时才能获得The android.Manifest.permission.SEND_SMS permission

解决方案是添加请求权限结果的回调方法(onRequestPermissionsResult)。只有在多次执行回调方法之后才能应用下一个权限。

  1. 下面通过实现onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)方法为这个问题提供了一个简单的解决方案。

a.在Activity.中获得许可

b.

  1. 以下是批量获取权限的复杂方法。下面是一个例子。

将要动态获取的权限添加到AndroidManifest.xml文件中。

b.在Activity中批量获取权限:

c.在获得onRequestPermissionsResult方法中的权限后执行处理。

  1. 建议您查看有关SMS消息发送失败的日志,以查找原因。您可以在Android控制台上查看日志。过滤字段是短消息

例如,如果您没有发送短消息的权限,则在调用发送短消息的代码时将生成以下日志:

  1. 您还可以在Toast消息中更改Msg,以便您可以通过Toast消息查看短信发送失败的原因。

吐司味精可改为""+e.getMessage()

错误消息:

  1. 以华为手机为例。当应用程序获得发送短消息的权限后,当您第一次发送消息时,将显示一个警告对话框,如下图所示。

因此,建议您查看日志,找出发送短信失败的原因.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66286453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档