Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓权限不存在';即使我已经宣布,它也不能工作_Java_Android_Android Permissions - Fatal编程技术网

Java 安卓权限不存在';即使我已经宣布,它也不能工作

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

我正试图编写代码从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.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>