Skip to content

Instantly share code, notes, and snippets.

@proffix4
Last active February 5, 2023 07:03
Show Gist options
  • Save proffix4/a550a775974e23908d6c0bb77a012474 to your computer and use it in GitHub Desktop.
Save proffix4/a550a775974e23908d6c0bb77a012474 to your computer and use it in GitHub Desktop.
Проблема с разрешениями в программах на Android
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="kz.talipovsn.permissions">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<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"
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
tools:targetApi="r">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
apply plugin: 'com.android.application'
android {
compileSdkVersion 33
defaultConfig {
applicationId "kz.talipovsn.permissions"
minSdkVersion 21
targetSdkVersion 33
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'com.google.android.material:material:1.8.0'
implementation 'org.apache.commons:commons-text:1.10.0'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-fragment:2.5.3'
implementation 'androidx.navigation:navigation-ui:2.5.3'
}
package kz.talipovsn.permissions;
import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
final String PSU_URL = "https://tou.edu.kz/images/links/gos_vestnik.png"; // Картинка для загрузки
final int RCODE_LOADING = 1; // Константа для идентификации запроса разрешений
String currentURL; // Переменная с URL-адресом загружаемой картинки
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
// Обработчик кнопки загрузки картинки
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentURL = PSU_URL;
saveImage(currentURL);
}
});
}
//-------------------------------------------------------
// Проверка наличия конкретного разрешения у программы
public static boolean hasPermission(Context context, String permission) {
int res = context.checkCallingOrSelfPermission(permission);
return res == PackageManager.PERMISSION_GRANTED;
}
// Проверка наличия списка разрешений у программы
public static boolean hasPermissionsList(Context context, String[] permissions) {
boolean hasAllPermissions = true;
for (String permission : permissions) {
if (!hasPermission(context, permission)) {
hasAllPermissions = false;
break;
}
}
return hasAllPermissions;
}
// Нужные разрешения для старых версий Android
public static String[] storge_permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
// Нужные разрешения для Android 33
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
public static String[] storge_permissions_33 = {
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_VIDEO
};
// Определяем перечень нужных разрешений для текущей версии Android
public static String[] permissions() {
String[] p;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
p = storge_permissions_33;
} else {
p = storge_permissions;
}
return p;
}
//-------------------------------------------------------
// Вызывается сразу после установки разрешения
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Если вызывается наш запрос на разрешения
if (requestCode == RCODE_LOADING) {
// Если разрешения даны, то сохранить картинку
if (hasPermissionsList(this, permissions())) {
saveImage(currentURL);
}
}
}
// Сохранение картинки с заданного адреса URL
private void saveImage(String url) {
try {
// Проверяем, есть ли нужные разрешения, если нет то выдаем окно запроса с выходом из этого метода
if (!hasPermissionsList(this, permissions())) {
ActivityCompat.requestPermissions(this, permissions(), RCODE_LOADING);
return;
}
// Если адрес нормальный, то загружаем картинку
if (URLUtil.isValidUrl(url)) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_PICTURES, Uri.parse(url).getLastPathSegment());
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
downloadManager.enqueue(request);
Toast.makeText(MainActivity.this, R.string.loaded, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, R.string.error, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(MainActivity.this, R.string.error, Toast.LENGTH_LONG).show();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment