From 65df6ca14e1e92d5ae34c3abc5158e4ece0ca2c7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 4 May 2019 07:29:41 +0200 Subject: [PATCH] android/Settings: request READ_EXTERNAL_STORAGE permission Using this API function requires SDK level 23. --- NEWS | 1 + android/meson.build | 2 +- android/src/Settings.java | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index e3e2a882b..c0512ac8a 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ver 0.21.9 (not yet released) * Android - fix crash on ARMv7 + - request storage permission on Android 6+ ver 0.21.8 (2019/04/23) * input diff --git a/android/meson.build b/android/meson.build index ddd3f030c..ee1f7cd31 100644 --- a/android/meson.build +++ b/android/meson.build @@ -6,7 +6,7 @@ android_sdk = get_option('android_sdk') android_abi = get_option('android_abi') android_sdk_build_tools_version = '27.0.0' -android_sdk_platform = 'android-21' +android_sdk_platform = 'android-23' android_build_tools_dir = join_paths(android_sdk, 'build-tools', android_sdk_build_tools_version) android_sdk_platform_dir = join_paths(android_sdk, 'platforms', android_sdk_platform) diff --git a/android/src/Settings.java b/android/src/Settings.java index 69b5305e2..2713fdc8c 100644 --- a/android/src/Settings.java +++ b/android/src/Settings.java @@ -21,10 +21,12 @@ package org.musicpd; import java.util.LinkedList; +import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -178,6 +180,14 @@ public class Settings extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + /* TODO: this sure is the wrong place to request + permissions - it will cause MPD to quit + immediately; we should request permissions when we + need them, but implementing that is complicated, so + for now, we do it here to give users a quick + solution for the problem */ + requestAllPermissions(); + setContentView(R.layout.settings); mRunButton = (ToggleButton) findViewById(R.id.run); mRunButton.setOnCheckedChangeListener(mOnRunChangeListener); @@ -203,6 +213,31 @@ public class Settings extends Activity { super.onCreate(savedInstanceState); } + private void checkRequestPermission(String permission) { + if (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) + return; + + try { + this.requestPermissions(new String[]{permission}, 0); + } catch (Exception e) { + Log.e(TAG, "requestPermissions(" + permission + ") failed", + e); + } + } + + private void requestAllPermissions() { + if (android.os.Build.VERSION.SDK_INT < 23) + /* we don't need to request permissions on + this old Android version */ + return; + + /* starting with Android 6.0, we need to explicitly + request all permissions before using them; + mentioning them in the manifest is not enough */ + + checkRequestPermission(Manifest.permission.READ_EXTERNAL_STORAGE); + } + private void connectClient() { mClient = new Main.Client(this, new Main.Client.Callback() {