Android RetroArch 从 Intent 加载 ROM
Android RetroArch load ROM from Intent
嘿,我正在尝试使用一个 Intent 来启动一个名为 RetroArch 的应用程序,并将所需的参数传递给它,以便它在不需要使用 RetroArch GUI 的情况下启动游戏。
我有一些我一直在看的参考资料:
This
This
This
This and This
我想出的代码是这样的:
public void onAddPicClick(String name) {
String gameName = name.replace(".png", "").replace(" ", "_");
Uri romPath = Uri.parse("android.resource://com.cpt.sample/raw/" + gameName);
/*Uri rom = Uri.parse(
"am start " +
"--user 0 " +
"-n com.retroarch/.browser.retroactivity.RetroActivityFuture " +
"-e ROM android.resource://com.example.telluridetainment/raw/" + gameName + ".nes " +
"-e LIBRETRO /data/data/com.retroarch/cores/fceumm_libretro_android.so " +
"-e CONFIGFILE /storage/emulated/0/Android/data/com.retroarch/files/retroarch.cfg " +
"-e QUITFOCUS " +
"--activity-clear-top " +
"--activity-clear-task " +
"--activity-no-history"
);*/
//Bundle b = new Bundle();
Intent intent = new Intent(Intent.ACTION_MAIN,null);
//Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage("com.retroarch");
//intent.setData(rom);
//intent.putExtra("n", "com.retroarch/.browser.retroactivity.RetroActivityFuture");
intent.putExtra("ROM", romPath);
intent.putExtra("LIBRETRO", "/data/data/com.retroarch/cores/nestopia_libretro_android.so");
intent.putExtra("CONFIGFILE", "/storage/emulated/0/Android/data/com.retroarch/files/retroarch.cfg");
//b.putString("QUITFOCUS", null);
//b.putString("activity-clear-top", null);
//b.putString("activity-clear-task", null);
//b.putString("activity-no-history", null);
//intent.putExtras(b);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
}
我已经能够启动 RetroArch,但还无法在没有用户交互的情况下 运行 ROM。
那么,为 Intent 编写此代码的正确方法是什么?
经过数小时的反复试验,我终于让它工作了。我在这里发布最终代码以防其他人偶然发现这个问题并需要解决方案。
下面是 NES 游戏核心,我使用的是 64bit RetrtoArch Plus apk
try {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.retroarch.aarch64", "com.retroarch.browser.retroactivity.RetroActivityFuture"));
intent.setAction("com.retroarch.aarch64/.browser.retroactivity.RetroActivityFuture");
intent.putExtra("ROM", "/storage/emulated/0/games/nes/Mario.nes");
intent.putExtra("LIBRETRO", "/data/data/com.retroarch.aarch64/cores/nestopia_libretro_android.so");
intent.putExtra("CONFIGFILE", "/storage/emulated/0/Android/data/com.retroarch.aarch64/files/retroarch.cfg");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
} catch (Exception e) {
Log.d("RetroArchDebugError", e.getMessage());
}
备注:
- 如果使用 32 位 RetroArch 版本,则将 com.retroarch.aarch64 替换为 com.retroarch.
- /storage/emulated/0/...为内部存储路径
- 核心 (.../cores/...) 需要根据您希望使用的模拟器进行更换。
您可以从 here
获取模拟器名称
嘿,我正在尝试使用一个 Intent 来启动一个名为 RetroArch 的应用程序,并将所需的参数传递给它,以便它在不需要使用 RetroArch GUI 的情况下启动游戏。
我有一些我一直在看的参考资料: This This This This and This
我想出的代码是这样的:
public void onAddPicClick(String name) {
String gameName = name.replace(".png", "").replace(" ", "_");
Uri romPath = Uri.parse("android.resource://com.cpt.sample/raw/" + gameName);
/*Uri rom = Uri.parse(
"am start " +
"--user 0 " +
"-n com.retroarch/.browser.retroactivity.RetroActivityFuture " +
"-e ROM android.resource://com.example.telluridetainment/raw/" + gameName + ".nes " +
"-e LIBRETRO /data/data/com.retroarch/cores/fceumm_libretro_android.so " +
"-e CONFIGFILE /storage/emulated/0/Android/data/com.retroarch/files/retroarch.cfg " +
"-e QUITFOCUS " +
"--activity-clear-top " +
"--activity-clear-task " +
"--activity-no-history"
);*/
//Bundle b = new Bundle();
Intent intent = new Intent(Intent.ACTION_MAIN,null);
//Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage("com.retroarch");
//intent.setData(rom);
//intent.putExtra("n", "com.retroarch/.browser.retroactivity.RetroActivityFuture");
intent.putExtra("ROM", romPath);
intent.putExtra("LIBRETRO", "/data/data/com.retroarch/cores/nestopia_libretro_android.so");
intent.putExtra("CONFIGFILE", "/storage/emulated/0/Android/data/com.retroarch/files/retroarch.cfg");
//b.putString("QUITFOCUS", null);
//b.putString("activity-clear-top", null);
//b.putString("activity-clear-task", null);
//b.putString("activity-no-history", null);
//intent.putExtras(b);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
}
我已经能够启动 RetroArch,但还无法在没有用户交互的情况下 运行 ROM。
那么,为 Intent 编写此代码的正确方法是什么?
经过数小时的反复试验,我终于让它工作了。我在这里发布最终代码以防其他人偶然发现这个问题并需要解决方案。
下面是 NES 游戏核心,我使用的是 64bit RetrtoArch Plus apk
try {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.retroarch.aarch64", "com.retroarch.browser.retroactivity.RetroActivityFuture"));
intent.setAction("com.retroarch.aarch64/.browser.retroactivity.RetroActivityFuture");
intent.putExtra("ROM", "/storage/emulated/0/games/nes/Mario.nes");
intent.putExtra("LIBRETRO", "/data/data/com.retroarch.aarch64/cores/nestopia_libretro_android.so");
intent.putExtra("CONFIGFILE", "/storage/emulated/0/Android/data/com.retroarch.aarch64/files/retroarch.cfg");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
} catch (Exception e) {
Log.d("RetroArchDebugError", e.getMessage());
}
备注:
- 如果使用 32 位 RetroArch 版本,则将 com.retroarch.aarch64 替换为 com.retroarch.
- /storage/emulated/0/...为内部存储路径
- 核心 (.../cores/...) 需要根据您希望使用的模拟器进行更换。
您可以从 here
获取模拟器名称