diff --git a/NEWS b/NEWS index 0582ec032..ff31ab6f6 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,11 @@ ver 0.22 (not yet released) - ffmpeg: new plugin based on FFmpeg's libavfilter library - hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback +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 - smbclient: download to buffer instead of throttling transfer diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index ba343453d..3bbb517e3 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -2,8 +2,8 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.musicpd" android:installLocation="auto" - android:versionCode="30" - android:versionName="0.21.8"> + android:versionCode="32" + android:versionName="0.21.9"> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/> diff --git a/android/build.py b/android/build.py index 842784d49..23ec9f256 100755 --- a/android/build.py +++ b/android/build.py @@ -138,6 +138,12 @@ class AndroidNdkToolchain: libstdcxx_ldflags = libstdcxx_flags + ' -L' + libcxx_libs_path libstdcxx_libs = '-lc++_static -lc++abi' + if self.is_armv7: + # On 32 bit ARM, clang generates no ".eh_frame" section; + # instead, the LLVM unwinder library is used for unwinding + # the stack after a C++ exception was thrown + libstdcxx_libs += ' -lunwind' + if use_cxx: self.cxxflags += ' ' + libstdcxx_cxxflags self.ldflags += ' ' + libstdcxx_ldflags 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() {