繁体   English   中英

Android 6.0(棉花糖)拒绝权限,并且不向用户显示“权限请求”对话框

[英]Android 6.0 (Marshmallow) Denying permissions and no Permission Request Dialog is shown to user

阅读了Android文档之后,我决定进行一次娱乐活动并“从设备中读取短信”。

但是,在Manifest中设置权限,并在(java)后面的代码中编写代码以请求权限,并在RequestPermission()上设置断点之后,我可以看到我的应用程序崩溃是因为“权限被拒绝”。

为什么在我声明了文档告诉我要声明的所有内容在您让操作系统要求用户授予或拒绝权限的情况下实现了该事情,我为什么拒绝权限(甚至不会发生-它不会向我显示一个对话框以授予或拒绝权限-我的应用程序甚至在显示之前就崩溃了!)

我怎么知道发生了什么事? 我怎样才能要求用户获得READ_SMS权限?

请注意, 几天来我一直在试图解决此问题,这是我最新的代码,但是已经进行了大约20次(完整)重写。 因此,如果缺少某些东西,它可能已经存在了,但是由于它不起作用而被删除了,或者为了进行故障排除以查看什么不起作用而将其删除。

表现:

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

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

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_SMS" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-feature
            android:name="android.hardware.telephony"
            android:required="true">
        </uses-feature>
        <grant-uri-permission android:path="content://sms/"
            android:pathPattern=".*"
            android:pathPrefix="\"/>
        <activity
            android:name=".Main"
            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>

</manifest>

Main.java(onCreate(...)):

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

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Testing Snackbar", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    RequestPermission(this);
}

Main.java(权限方法):

private static final int MY_PERMISSIONS_REQUEST_READ_SMS = 226;

protected void RequestPermission(Activity activity)
{
    if(ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED)
    {
        if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_SMS)) {
            return;
        }
        else
        {
            ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.READ_SMS
            }, MY_PERMISSIONS_REQUEST_READ_SMS);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
    switch(requestCode)
    {
        case MY_PERMISSIONS_REQUEST_READ_SMS:
        {
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                MessageAdapter messageAdapter = new MessageAdapter(GetMessages());
                RecyclerView recList = (RecyclerView) findViewById(R.id.messagesList);
                recList.setAdapter(messageAdapter);

                // CardView List
                LinearLayoutManager llm = new LinearLayoutManager(this.getApplicationContext());
                llm.setOrientation(LinearLayoutManager.VERTICAL);
                recList.setLayoutManager(llm);
            }
            else
            {
                return;
            }

            return;
        }
    }
}

您应该修复的一个地方是:

if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_SMS)) {
            return;
        }

在这里你只是回来,而你实际上应该显示rationalle为什么你需要这个权限,然后要求它。 通常的方法是使用Snackbar或对话框,或者直接立即调用ActivityCompat.requestPermissions( -至少出于测试目的。

[编辑]

  Snackbar.make(activity, R.string.rationaleStringId, Snackbar.LENGTH_INDEFINITE)
          .setAction(android.R.string.ok, new View.OnClickListener() {
            @Override
            @TargetApi(Build.VERSION_CODES.M)
            public void onClick(View v) {
                 ActivityCompat.requestPermissions(activity, new String[] {Manifest.permission.READ_SMS}, MY_PERMISSIONS_REQUEST_READ_SMS);
            }
          }).show();

您的<uses-permission>元素和<uses-feature>元素放在错误的位置。 它们作为根<manifest>元素的直接子元素而位于<application>元素之外。

另外,删除<grant-uri-permission>元素。 它不仅是不正确的地方,但你没有一个正确的地方吧,因为只有去作为的子<provider>元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM