Разрешения Android API 33 не предоставляются
Итак, как я прочитал на сайте developer.androidAndroid 13
вносит новые изменения в поле Разрешение.
У меня есть приложение для чата, в котором мне нужно совершать звонки, открывать камеру, записывать аудио, читать и писать во внешнее хранилище. Итак, в SplashScreen я запрашиваю эти разрешения у пользователя. Однако некоторые из них не предоставляются, но даже система не просит меня о них.
Вот что я заявил вAndroidManifest.xml
файл
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:name=".ChatApplication"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="false"
android:hardwareAccelerated="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/logo"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"
tools:replace="android:allowBackup, android:label">
И вот что у меня есть в Splashscreen Activity
class SplashActivity : BaseActivity() {
private val splashViewModel: SplashViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
if (!hasPermissions(this, *REQUIRED_PERMISSIONS))
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, ALL_PERMISSIONS)
else
Handler(Looper.getMainLooper()).postDelayed ({ startUi() }, 1000)
}
private fun hasPermissions(context: Context, vararg permissions: String): Boolean =
permissions.all {
ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}
private fun startUi() {
// navigate to main application
}
private fun finishActivity() {
toast("You must grant all required permissions to continue")
finish()
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
ALL_PERMISSIONS -> {
if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) startUi()
else finishActivity()
}
}
}
companion object {
const val ALL_PERMISSIONS = 10
private val REQUIRED_PERMISSIONS =
mutableListOf (
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
).apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
add(Manifest.permission.READ_MEDIA_IMAGES)
add(Manifest.permission.READ_MEDIA_VIDEO)
add(Manifest.permission.READ_MEDIA_AUDIO)
add(Manifest.permission.POST_NOTIFICATIONS)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}.toTypedArray()
}
}
Когда я ставлю точку останова наonRequestPermissionsResult
я вижу это
Запросы разрешения, которые я вижу на экране, предназначены для камеры, записи звука и состояния телефона. После этого приложение завершает работу, вызываяfinishActivity()
Я запускаю приложение вPixel 6 Pro API 33
Эмулятор Как правильно это сделать? Как я могу это решить?
2 ответа
Я не смог найти решение, которое соответствовало бы моей ситуации. Я хотел иметь разрешение для ОС Android 13 и ниже, чтобы получать изображения из галереи.
Вот что я придумал:
Мой манифест в 13 (приложение необходимо использовать в течение 10 минут):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
Добавлено в основной класс CONTAININGActivity над методом onCreate:
private static final int REQUEST_CODE_STORAGE_PERMISSION = 1;
Добавлено в класс/активность вне метода onCreate:
private static final String readExternalStorage;
private static final String readMediaImages;
public static String storage_permissions = readExternalStorage = Manifest.permission.READ_EXTERNAL_STORAGE;
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
public static String storage_permissions_33 = readMediaImages = Manifest.permission.READ_MEDIA_IMAGES;
public static String[] permissions() {
String p;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
p = storage_permissions_33;
} else {
p = storage_permissions;
}
return new String[]{p};
}
Я использовал это в ActivityCompat для разрешений:
ActivityCompat.requestPermissions(
CONTAININGActivity.this,
permissions(),
REQUEST_CODE_STORAGE_PERMISSION
);
private val mPermissions = if(Build.VERSION.SDK_INT >=33 ){
arrayOf (
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_IMAGES)
}else{
arrayOf (
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
}