1package com.jme3.system.android; 2 3import android.app.Activity; 4import android.content.res.Resources; 5import android.os.Environment; 6import com.jme3.asset.AndroidAssetManager; 7import com.jme3.asset.AssetManager; 8import com.jme3.audio.AudioRenderer; 9import com.jme3.audio.android.AndroidAudioRenderer; 10import com.jme3.system.AppSettings; 11import com.jme3.system.JmeContext; 12import com.jme3.system.JmeContext.Type; 13import com.jme3.system.JmeSystemDelegate; 14import com.jme3.system.Platform; 15import com.jme3.util.AndroidLogHandler; 16import com.jme3.util.JmeFormatter; 17import java.io.File; 18import java.net.URL; 19import java.util.logging.Handler; 20import java.util.logging.Level; 21 22public class JmeAndroidSystem extends JmeSystemDelegate { 23 24 private static Resources res; 25 private static Activity activity; 26 27 @Override 28 public AssetManager newAssetManager(URL configFile) { 29 logger.log(Level.INFO, "newAssetManager({0})", configFile); 30 return new AndroidAssetManager(configFile); 31 } 32 33 @Override 34 public AssetManager newAssetManager() { 35 logger.log(Level.INFO, "newAssetManager()"); 36 return new AndroidAssetManager(null); 37 } 38 39 @Override 40 public boolean showSettingsDialog(AppSettings sourceSettings, boolean loadFromRegistry) { 41 return true; 42 } 43 44 @Override 45 public JmeContext newContext(AppSettings settings, Type contextType) { 46 initialize(settings); 47 return new OGLESContext(); 48 } 49 50 @Override 51 public AudioRenderer newAudioRenderer(AppSettings settings) { 52 return new AndroidAudioRenderer(activity); 53 } 54 55 @Override 56 public void initialize(AppSettings settings) { 57 if (initialized) { 58 return; 59 } 60 61 initialized = true; 62 try { 63 JmeFormatter formatter = new JmeFormatter(); 64 65 Handler consoleHandler = new AndroidLogHandler(); 66 consoleHandler.setFormatter(formatter); 67 } catch (SecurityException ex) { 68 logger.log(Level.SEVERE, "Security error in creating log file", ex); 69 } 70 logger.log(Level.INFO, "Running on {0}", getFullName()); 71 } 72 73 @Override 74 public Platform getPlatform() { 75 String arch = System.getProperty("os.arch").toLowerCase(); 76 if (arch.contains("arm")) { 77 if (arch.contains("v5")) { 78 return Platform.Android_ARM5; 79 } else if (arch.contains("v6")) { 80 return Platform.Android_ARM6; 81 } else if (arch.contains("v7")) { 82 return Platform.Android_ARM7; 83 } else { 84 return Platform.Android_ARM5; // unknown ARM 85 } 86 } else { 87 throw new UnsupportedOperationException("Unsupported Android Platform"); 88 } 89 } 90 91 @Override 92 public synchronized File getStorageFolder() { 93 //http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir 94 //http://developer.android.com/guide/topics/data/data-storage.html 95 96 boolean mExternalStorageWriteable = false; 97 String state = Environment.getExternalStorageState(); 98 if (Environment.MEDIA_MOUNTED.equals(state)) { 99 mExternalStorageWriteable = true; 100 } else { 101 mExternalStorageWriteable = false; 102 } 103 104 if (mExternalStorageWriteable) { 105 //getExternalFilesDir automatically creates the directory if necessary. 106 //directory structure should be: /mnt/sdcard/Android/data/<packagename>/files 107 //when created this way, the directory is automatically removed by the Android 108 // system when the app is uninstalled 109 storageFolder = activity.getApplicationContext().getExternalFilesDir(null); 110 logger.log(Level.INFO, "Storage Folder Path: {0}", storageFolder.getAbsolutePath()); 111 112 return storageFolder; 113 } else { 114 return null; 115 } 116 117 } 118 119 public static void setResources(Resources res) { 120 JmeAndroidSystem.res = res; 121 } 122 123 public static Resources getResources() { 124 return res; 125 } 126 127 public static void setActivity(Activity activity) { 128 JmeAndroidSystem.activity = activity; 129 } 130 131 public static Activity getActivity() { 132 return activity; 133 } 134} 135