发送短信权限不起作用

Posted

技术标签:

【中文标题】发送短信权限不起作用【英文标题】:Send sms permission doesn't work 【发布时间】:2016-02-12 09:24:45 【问题描述】:

我想发送一条简单的消息,我的清单中有 <uses-permission android:name="android.permission.SEND_SMS"/>,但我总是收到:java.lang.SecurityException: Sending SMS message: uid 10064 does not have android.permission.SEND_SMS.

我检查了this answer,但还是不行。

这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.roa.sendsms" >


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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

这是我的代码:

package com.roa.sendsms;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.telephony.SmsManager;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;

public class MainActivity extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Button sendButton =  (Button)findViewById(R.id.sendButton);
    sendButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            sendSms(phoneNumber, "you get message from roish app!!");
        
    );


private void sendSms(String phoneNumber, String message)
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);

谢谢大家。

【问题讨论】:

我猜你是在 Android M (6) 上测试它,对吗? 你所说的uses-sdk是什么意思?他可能在build.gradle 文件中指定了它 如果您在 Android M 上进行测试,请在设备上安装应用并在设置中检查应用权限。如果有权限,请尝试打开权限。如果它现在可以工作,请按照developer.android.com/training/permissions/requesting.html 的说明进行操作 @VizGhar 知道了。您的链接很有用 我在模拟器上运行它。我会尝试在我的设备上安装它... 【参考方案1】:

尝试使用类似的东西。未经测试,但应该可以正常工作。当您在此处发现问题时,请记下。

这只是为了展示在 Android M 中授予权限的工作原理。请通过Android tutorial site about permissions 中提到的功能对其进行扩展。

您将需要添加 ActivityCompat.shouldShowRequestPermissionRationale 检查以匹配最佳实践。我可以扩展这个答案,但我认为没有必要。只需确保您在运行时授予权限(或使用低于 23 的 targetSdkVersion - 但不建议这样做)

private static final int PERMISSION_SEND_SMS = 123;

private void requestSmsPermission() 

    // check permission is given
    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) 
        // request permission (see result in onRequestPermissionsResult() method)
        ActivityCompat.requestPermissions(thisActivity,
            new String[]Manifest.permission.SEND_SMS,
            PERMISSION_SEND_SMS);
     else 
        // permission already granted run sms send
        sendSms(phone, message);
    


@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 
    switch (requestCode) 
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: 

            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                // permission was granted
                sendSms(phone, message);
             else 
                // permission denied
            
            return;
        
    


private void sendSms(String phoneNumber, String message)
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);

【讨论】:

谢谢你。现在我的代码正在运行。正如您在我的回答中看到的那样,问题出在模拟器上。但也许我稍后会尝试。非常感谢【参考方案2】:

你需要做的就是,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.roa.sendsms"
    android:versionCode="1"
    android:versionName="1.0">

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.example.homesafe.MainActivity"
            android:label="@string/app_name">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

尝试跑进手机,而不是在模拟器中检查。只是因为模拟器没有我们手机的sim卡,所以。

【讨论】:

太奇怪了,在模拟器中应用程序崩溃了。但在我的设备中它可以工作。为什么? 因为模拟器确实有我们手机的 sim 卡,所以这就是你的应用崩溃的原因。 这就是为什么我告诉你它对我有用,为什么它不适合你。无论如何,njoy和hv fun :) 如果这个答案对你有帮助,你可以接受这个答案并投票。 这将适用于 eclipse(请不要使用它)或者如果 build.gradle 中缺少某些配置。如果你在build.gradle中配置了android.defaultConfig.targetSdkVersion;清单中的targetSdkVersion 将不会被使用。【参考方案3】:

你可以试试这个方法:

private void sendSms(String phoneNumber, String message) 
   Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse( "sms:" + phoneNumber ) ); 
   intent.putExtra( "sms_body", message ); 
   startActivity(intent);

【讨论】:

【参考方案4】:

应该可以的

PackageManager pm = this.getPackageManager();

 if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) 
     System.out.println("Supported");
  else 
     System.out.println("nope");
 

【讨论】:

【参考方案5】:

我有同样的问题你需要获得设置>应用程序>“你的应用程序”>启用短信权限的运行时权限

【讨论】:

【参考方案6】:

如果你的消息太长,使用smsManager.sendTextMessage(.. 会悄悄地失败。

你需要使用smsManager.sendMultipartTextMessage(...

SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> messageList = smsManager.divideMessage(message.toString());
smsManager.sendMultipartTextMessage(phoneNumber, null, messageList, null, null);

【讨论】:

【参考方案7】:

我在华为 Android 8 上试过这个,除了在清单中添加权限 READ_PHONE_STATE 外,手机还需要允许“访问手机 ID”到应用程序。然后它工作。

【讨论】:

以上是关于发送短信权限不起作用的主要内容,如果未能解决你的问题,请参考以下文章

更改默认短信应用意图在 android 10 上不起作用

Twilio 传入的短信在 Zoho CRM 中不起作用

firebase auth的自动检测验证码不起作用

收听传出的短信不起作用android

用于文本消息的 MFMessageComposeViewController 在 iPad 中不起作用

phonegap 推送通知在 iPhone 上不起作用