diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java index 9685b1e9f..20f092925 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java @@ -19,9 +19,11 @@ package com.flycast.emulator; import android.app.Activity; +import android.app.AlertDialog; import android.content.ContentResolver; import android.content.ContentUris; import android.content.CursorLoader; +import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.media.MediaScannerConnection; @@ -76,7 +78,27 @@ public class AndroidStorage { } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - activity.getContentResolver().takePersistableUriPermission(uri, storageIntentPerms); + { + try { + activity.getContentResolver().takePersistableUriPermission(uri, storageIntentPerms); + } catch (SecurityException e) { + Log.w("Flycast", "takePersistableUriPermission failed", e); + AlertDialog.Builder dlgAlert = new AlertDialog.Builder(activity); + dlgAlert.setMessage("Can't get permissions to access this folder.\nPlease select a different one."); + dlgAlert.setTitle("Storage Error"); + dlgAlert.setPositiveButton("Ok", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog,int id) { + addStorageCallback(null); + } + }); + dlgAlert.setIcon(android.R.drawable.ic_dialog_alert); + dlgAlert.setCancelable(false); + dlgAlert.create().show(); + return; + } + } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { String realPath = getRealPath(uri); if (realPath != null) { diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java index 2b617d530..603a58414 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java @@ -270,7 +270,10 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. } @Override public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK + && event.getAction() == MotionEvent.ACTION_MOVE + && event.getDevice() != null) + { List axes = event.getDevice().getMotionRanges(); boolean rc = false; for (InputDevice.MotionRange range : axes) @@ -416,9 +419,11 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. } - private String getDefaultHomeDir() - { - return getExternalFilesDir(null).getAbsolutePath(); + private String getDefaultHomeDir() { + File dir = getExternalFilesDir(null); + if (dir == null) + dir = getFilesDir(); + return dir.getAbsolutePath(); } private String checkHomeDirectory(String homeDir) diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java index 0bd030a86..0256f6d6f 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java @@ -55,8 +55,13 @@ public class HomeMover { File f = getFile(parent); if (f != null) return new File(f, kid).toURI().toString(); - else - return storage.getSubPath(parent, kid); + else { + try { + return storage.getSubPath(parent, kid); + } catch (RuntimeException e) { + return null; + } + } } public FileInfo[] listContent(String folder) @@ -97,6 +102,8 @@ public class HomeMover { } public boolean exists(String path) { + if (path == null) + return false; File file = getFile(path); if (file != null) return file.exists(); @@ -139,6 +146,8 @@ public class HomeMover { Thread thread = new Thread(new Runnable() { private void copyFile(String path, String name, String toDir) { + if (path == null) + return; //Log.d("flycast", "Copying " + path + " to " + toDir); try { InputStream in = wrapper.openInputStream(path); diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java index f9a2bd95f..65ef5e60a 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java @@ -61,7 +61,7 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene @Override public void onInputDeviceAdded(int i) { InputDevice device = InputDevice.getDevice(i); - if ((device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) == InputDevice.SOURCE_CLASS_BUTTON) { + if (device != null && (device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) == InputDevice.SOURCE_CLASS_BUTTON) { int port = 0; if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { port = this.maple_port == 3 ? 3 : this.maple_port++;