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() {