Java 安卓权限不存在';即使我已经宣布,它也不能工作
我正试图编写代码从Android应用程序发送短信,但当我尝试发送短信时,它会将错误发回给我:Java 安卓权限不存在';即使我已经宣布,它也不能工作,java,android,android-permissions,Java,Android,Android Permissions,我正试图编写代码从Android应用程序发送短信,但当我尝试发送短信时,它会将错误发回给我: 09-17 18:37:29.974 12847-12847/*******E/AndroidRuntime﹕ 致命异常:主 流程:*****************,PID:12847 java.lang.SecurityException:发送SMS消息:uid 10092没有android.permission.SEND\u SMS。 位于android.os.Parcel.readExcepti
09-17 18:37:29.974 12847-12847/*******E/AndroidRuntime﹕ 致命异常:主
流程:*****************,PID:12847
java.lang.SecurityException:发送SMS消息:uid 10092没有android.permission.SEND\u SMS。
位于android.os.Parcel.readException(Parcel.java:1599)
在android.os.Parcel.readException(Parcel.java:1552)中
位于com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
位于android.telephony.smsmsmanager.sendTextMessageInternal(SmsManager.java:310)
位于android.telephony.smsmsmanager.sendTextMessage(smsmsmanager.java:293)
在**.*.****.MainActivity$3.onClick(MainActivity.java:70)
在android.view.view.performClick上(view.java:5198)
在android.view.view$PerformClick.run(view.java:21147)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我已选中,但我在清单中拥有以下权限:
<?xml version="1.0" encoding="utf-8"?>
我在网上搜索了一下,但是所有的错误都是关于
语法的,你能帮我一下吗?(以下摘录自)
现在没有得到你的许可的主要原因是
您的项目具有23或更高的targetSdkVersion
,并且
你所要求的是“危险的”。在Android 6.0中,这包括:
接受移交
ACCESS\u BACKGROUND\u LOCATION
访问媒体位置
活动识别
接听电话
ACCESS\u rough\u LOCATION
ACCESS\u FINE\u LOCATION
添加语音邮件
车身传感器
CALL\u电话
摄像机
GET\u账户
处理拨打的电话
阅读日历
READ\u CALL\u LOG
READ\u CELL\u广播
读取联系人
读取外部存储器
READ\u PHONE\u STATE
READ\u SMS
接收彩信
接收短信
RECEIVE\u WAP\u PUSH
录制音频
发送短信
使用\u SIP
写日历
WRITE\u CALL\u LOG
写入联系人
写入外部存储
targetSdkVersion
23+应用程序
需要有
元素,但您也有
在运行时向Android 6.0上的用户请求这些权限+
使用checkSelfPermission()
和
requestPermissions()
作为临时解决办法,请将targetSdkVersion
放在23下方
然而,最终,你会有一些理由想要你的
targetSdkVersion
为23或更高。到那时,你将需要
调整应用程序以使用新的运行时权限系统。
Android文档已经发布
.如果您使用的是sdk 23或更高版本,则必须检查运行时权限。以及Commonware的答案 有一个安全设置(我在CM13上检查)来设置SMS消息限制。如果您将此设置为“无”,操作系统将为每个SMS弹出一个对话框,即使在运行时获得SMS_SEND权限。最好是将其设置为最大值
如果最大值还不够,有办法提高根设备上的最大速率。当您在
清单
中声明permisson
并且它不起作用时,意味着您正在棉花糖
中执行任务,对于棉花糖
,您已在运行时设置permisson
这样
ActivityCompat.requestPermissions();
我将此添加到我的主要活动中,以解决我的问题
int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0;
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
在API级别23以上,您将获得编程实用性的帮助,如:
private static final int PERMISSION_REQUEST_CODE = 1;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.SEND_SMS)
== PackageManager.PERMISSION_DENIED) {
Log.d("permission", "permission denied to SEND_SMS - requesting it");
String[] permissions = {Manifest.permission.SEND_SMS};
requestPermissions(permissions, PERMISSION_REQUEST_CODE);
}
}
务实地请求许可(API 23之后)
“如果应用程序具有该权限,则方法checkSelfPermission()将返回已授予的权限,\u,应用程序可以继续操作
如果应用程序没有权限,则该方法返回permission_DENIED,应用程序必须显式请求用户权限。您需要提示用户该权限,如上面的代码所示。调用requestPermissions()会弹出一个标准的Android对话框,您无法自定义该对话框。”如果您使用的是Android版本“23”或“23+”,则当您尝试访问任何需要用户许可的内容时,应用程序将向您显示错误。您必须在运行时请求权限,即使您已在Android清单中声明了这些权限
选中此项:
但是,如果您已经创建了整个应用程序,并且不想在每个地方都进行更改,那么一点欺骗就足够了
转到“Build.gradle”文件,将目标Sdk版本更改为低于23,如22、21。请通过下面的链接,
这里还提供了一些示例来开始使用权限
为了使android更加安全,现在开发者必须在清单中提到权限,他们还必须在运行时要求用户完成工作。他们是体育老师
private static final int PERMISSION_REQUEST_CODE = 1;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.SEND_SMS)
== PackageManager.PERMISSION_DENIED) {
Log.d("permission", "permission denied to SEND_SMS - requesting it");
String[] permissions = {Manifest.permission.SEND_SMS};
requestPermissions(permissions, PERMISSION_REQUEST_CODE);
}
}
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Ask for permision
ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.SEND_SMS}, 1);
}
else {
// Permission has already been granted
}
READ_CALENDAR
WRITE_CALENDAR
CAMERA
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
RECORD_AUDIO
READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS
BODY_SENSORS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
1);
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
public boolean checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Timber.tag(LOG_TAG).e("Permission error. You have permission");
return true;
} else {
Timber.tag(LOG_TAG).e("Permission error. You have asked for permission");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else {
// for a stuff below api level 23
Timber.tag(LOG_TAG).e("Permission error. You already have the permission");
return true;
}
}
adb shell dumpsys package <package-name>