发送短信权限不起作用
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”到应用程序。然后它工作。
【讨论】:
以上是关于发送短信权限不起作用的主要内容,如果未能解决你的问题,请参考以下文章