diff --git a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java index b14eb9e95..532864729 100644 --- a/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java +++ b/shell/android-studio/reicast/src/main/java/com/reicast/emulator/BaseGLActivity.java @@ -48,8 +48,10 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. protected Handler handler = new Handler(); public static byte[] syms; private boolean audioPermissionRequested = false; + private boolean storagePermissionGranted = false; private boolean paused = true; private boolean resumedCalled = false; + private String pendingIntentUrl; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -90,7 +92,7 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. setStorageDirectories(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !storagePermissionGranted) { ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, @@ -117,7 +119,10 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. + gameUri.getAuthority() + "/external_files", "/storage")); } if (gameUri != null) - JNIdc.setGameUri(gameUri.toString()); + if (storagePermissionGranted) + JNIdc.setGameUri(gameUri.toString()); + else + pendingIntentUrl = gameUri.toString(); } } } @@ -292,7 +297,13 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. JNIdc.setupMic(sip); } else if (requestCode == STORAGE_PERM_REQUEST) { + storagePermissionGranted = true; setStorageDirectories(); + if (pendingIntentUrl != null) { + JNIdc.setGameUri(pendingIntentUrl); + pendingIntentUrl = null; + } + //setup mic if (Emulator.micPluggedIn()) requestRecordAudioPermission(); diff --git a/shell/android-studio/reicast/src/main/jni/src/Android.cpp b/shell/android-studio/reicast/src/main/jni/src/Android.cpp index 3766a1b48..9e5de9d91 100644 --- a/shell/android-studio/reicast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/reicast/src/main/jni/src/Android.cpp @@ -138,11 +138,10 @@ bool egl_makecurrent(); extern int screen_width,screen_height; -static char gamedisk[256]; - float vjoy_pos[15][8]; extern bool print_stats; +extern bool game_started; //stuff for saving prefs jobject g_emulator; @@ -245,19 +244,23 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setGameUri(JNIEnv *en { // Get filename string from Java const char* file_path = env->GetStringUTFChars(fileName, 0); - INFO_LOG(BOOT, "Game Disk URI: '%s'", file_path); - strncpy(gamedisk, strlen(file_path) >= 7 && !memcmp(file_path, "file://", 7) ? file_path + 7 : file_path, sizeof(gamedisk)); - gamedisk[sizeof(gamedisk) - 1] = '\0'; + NOTICE_LOG(BOOT, "Game Disk URI: '%s'", file_path); + strncpy(settings.imgread.ImagePath, strlen(file_path) >= 7 && !memcmp(file_path, "file://", 7) ? file_path + 7 : file_path, sizeof(settings.imgread.ImagePath)); + settings.imgread.ImagePath[sizeof(settings.imgread.ImagePath) - 1] = '\0'; env->ReleaseStringUTFChars(fileName, file_path); - - cfgSetVirtual("config", "image", file_path); + // TODO game paused/settings/... + if (game_started) { + dc_stop(); + gui_state = Main; + game_started = false; + dc_reset(true); + } } } //stuff for microphone jobject sipemu; jmethodID getmicdata; -extern bool game_started; //stuff for audio #define SAMPLE_COUNT 512