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