Мой интерфейс прав доступа не работает должным образом для Android API 24 и выше - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу создать код, который при запуске приложения запрашивает разрешения (WRITE и CAMERA).Если одно или все разрешения отклонены, то приложение отображает текст предупреждения (в TextView), запрашивающий разрешения, а также кнопку «Разрешение» (также сделанное из TextView), которая БУДЕТ ОСТАВЛЯТЬСЯ ВИДИМЫМ, в то время как пользователь продолжает отрицать любое или все эти разрешения.

Этот прототип приложения прекрасно работает в API эмулятора 23, но в API 24 эмулятора и выше он не работал должным образом.

Вот коды:

1)AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lf.permissionsfromlf">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2" />
    <uses-feature android:name="android.hardware.camera"
        android:required="true" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

2) activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/permissionNote"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:gravity="center"
        android:letterSpacing="0.1"
        android:text="@string/give_permission"
        android:textColor="#000066"
        android:textSize="16sp"
        android:textStyle="bold"
        android:visibility="invisible"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/permission_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:background="@drawable/permission_btn"
        android:gravity="center"
        android:letterSpacing="0.1"
        android:text="@string/permission"
        android:textColor="#ffffff"
        android:textSize="20sp"
        android:textStyle="bold"
        android:visibility="invisible"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.50"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/permissionNote" />

</android.support.constraint.ConstraintLayout>

3) MainActivity.java

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
    TextView permissionNote;
    TextView permission_btn;
    boolean WRITE_GRANTED = false;
    boolean CAMERA_GRANTED = false;
    static final int REQUEST_PERMISSION_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ///////////
        permissionNote =  findViewById(R.id.permissionNote);
        permission_btn =  findViewById(R.id.permission_btn);
        permissionNote.setVisibility(View.INVISIBLE);
        permission_btn.setVisibility(View.INVISIBLE);

        //Sets OnClick for the PERMISSION BUTTON in case it becomes necessary
        permission_btn.setOnClickListener(new TextView.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if( !WRITE_GRANTED || !CAMERA_GRANTED )
                request_permission();
            }
        });

        //VERIFY IF PERMISSIONS ARE GRANTED for SDK_INT >= 23
        if( Build.VERSION.SDK_INT >= 23 )
        {
            //Verifies if permission was already granted
            if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) ||
                    (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                            != PackageManager.PERMISSION_GRANTED))
            {
                permissionNote.setVisibility(View.VISIBLE);
                permission_btn.setVisibility(View.VISIBLE);
                request_permission();
            }
            else
            {
                // Permission has already been granted
                permissionNote.setVisibility(View.INVISIBLE);
                permission_btn.setVisibility(View.INVISIBLE);
            }
            //////////////////////
            if( WRITE_GRANTED && CAMERA_GRANTED )
            {
                // Permission has already been granted
                permissionNote.setVisibility(View.INVISIBLE);
                permission_btn.setVisibility(View.INVISIBLE);
            }
            //////////////////////
        }
    }

    public void request_permission()
    {
        if(!WRITE_GRANTED)
        {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_PERMISSION_CODE);
        }
        if(!CAMERA_GRANTED)
        {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    REQUEST_PERMISSION_CODE);
        }
        ////////////////////////
        // IF ALL PERMISSIONS ARE GRANTED, MAKE PERMISSION BUTTON INVISIBLE
        if(write_permission_granted())
        {
            WRITE_GRANTED = true;
        }
        if(camera_permission_granted())
        {
            CAMERA_GRANTED = true;
        }

    }

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults)
{
    switch (requestCode) {
        case REQUEST_PERMISSION_CODE:
        {
            // If request is cancelled, the resulting arrays is empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                // Calling write_permission_granted and camera_permission_granted() after
                // onRequestPermissionsResult
                // updates write_permission and camera permission as to make the PERMISSION BUTTON invisible
                if(write_permission_granted() && camera_permission_granted()) //CAMERA_GRANTED = true;
                {
                    permissionNote.setVisibility(View.INVISIBLE);
                    permission_btn.setVisibility(View.INVISIBLE);
                }
            }

            return;
        }
    }

}




    public boolean write_permission_granted()
    {
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) return true;
        else return false;
    }

    public boolean camera_permission_granted()
    {
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) return true;
        else return false;
    }
}

Таким образом, идея заключается в том, что предупреждение и кнопкаостанется видимым на экране в случае, если пользователь передумает и нажмет кнопку, чтобы дать все разрешения.После того, как все разрешения предоставлены, сразу же появляется предупреждение и кнопка ДОЛЖНА исчезнуть (стать невидимой).

В эмуляторе API 24 при запуске приложения появляется только всплывающее окно с вопросом «Разрешить приложению доступ кфотографии, мультимедиа и файлы на вашем устройстве? ».После ответа на этот вопрос также должно появиться второе окно с вопросом «Разрешить этому приложению делать снимки и записывать видео?», НО ЭТОГО НЕ ПРОИСХОДИТ.Как следствие, предупреждение и кнопка «РАЗРЕШЕНИЕ» остаются на экране.Итак, после этого, когда я нажимаю на эту кнопку в первый раз, она не отвечает.Во второй раз, когда я нажимаю снова, появляется окно «Разрешить этому приложению делать снимки ...».Только после того, как это второе разрешение будет окончательно предоставлено, только тогда предупреждение и кнопка исчезнут (станут невидимыми), но это должно было произойти прямо в начале приложения.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я только что понял!

Это было намного проще, чем я себе представлял.

Мне просто нужно создать массив строк для хранения моих разрешений:

private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};

И затем в методе public void request_permission() я сделал это изменение:

if(!WRITE_GRANTED || !CAMERA_GRANTED) {
    ActivityCompat.requestPermissions(this,permissions, REQUEST_PERMISSION_CODE);
}
0 голосов
/ 08 февраля 2019

Вы запускаете два запроса на разрешение одновременно.Первый запрос показывает диалог.Второй запрос молча отменяется, потому что другой диалог разрешения уже отображается.Это можно проверить, проверив permissions.length == 0 в onRequestPermissionsResult (пустые массивы означают отмененный запрос).

Не запускать разные запросы разрешений с одним и тем же кодом запроса.

Поместить оба разрешения водин запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...