2014-12-08 1 views
0

Совершенно новый для разработки Android, поэтому надежда some1 может просветить меня. Имел справедливую долю в googling, но все еще застрял. Я использую Unity 4 и Eclipse, пытаясь отобразить галерею изображений и получить Uri изображения. (Примечание: я использую плагин социальной сети Prime31 android)Unity Android Gallery

Сначала я не расширил UnityPlayerActivity, но я понял, что не могу получить onActivityResult, если я его не продлю. После расширения я получаю «Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()». Пробовал runonuithread и не работал, но может быть из-за моего опыта в использовании. Так надейтесь, что вы, ребята, можете помочь.

Ниже то, что я сделал в Eclipse:

public class AndroidGalleryPlugin extends UnityPlayerActivity{ 

public static AndroidGalleryPlugin plugin_instance; 
public Uri ImageURI; 
static final int REQUEST_CODE = 1; 

static Context _context; 

public static AndroidGalleryPlugin instance() 
{ 
    if(plugin_instance == null) 
     plugin_instance = new AndroidGalleryPlugin(); 
    return plugin_instance; 
} 

private AndroidGalleryPlugin() {} 

public static void StartOpenGallery (Context mContext) 
{ 
    Log.d("AndroidGalleryPlugin", "Start Open Gallery"); 
    _context = mContext; 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    Activity activity = (Activity) _context; 
    activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), REQUEST_CODE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    Log.d("AndroidGalleryPlugin", "onActivityResult"); 
} 

// And to convert the image URI to the direct file system path of the image file 
public String getRealPathFromURI(Uri contentUri) { 

    Log.d("AndroidGalleryPlugin", "Get URI"); 
} 

}

Код В Unity:

jc = new AndroidJavaClass ("com.asd.androidgallery.AndroidGallery"); 
jo = jc.CallStatic <AndroidJavaObject> ("instance"); 

if(jo == null) 
{ 
    Debug.LogError ("Java Obj Null"); 
    return false; 
} 

unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
unityObj = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); 

if(unityObj == null) 
{ 
    Debug.LogError ("Unity Obj Null"); 
    return false; 
} 

jo.CallStatic("StartOpenGallery", unityObj); 

Это мой androidmanifest:

<activity android:name="com.prime31.UnityPlayerNativeActivity" android:label="@string/app_name" android:screenOrientation="sensorPortrait"> 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 
    <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /> 
</activity> 

<activity android:name="com.asd.androidgallery.AndroidGalleryPlugin" android:configChanges="orientation"></activity> 
+0

Существует также плагин, который делает то же самое, такие как «Native Gallery Assist» - (https://www.assetstore.unity3d.com/en/#!/content/60922) Он работает как Android, а также iOS. – Chris

ответ

1

Здесь есть некоторые изменения , Первый для кода Java

public class AndroidGalleryPlugin extends UnityPlayerActivity{ 

public Uri ImageURI; 
static final int REQUEST_CODE = 1; 
private Activity _activity; 

@Override 
protected void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 
    _activity = UnityPlayer.currentActivity; 
} 

public static void StartOpenGallery (Context mContext) 
{ 
    Log.d("AndroidGalleryPlugin", "Start Open Gallery"); 
    _context = mContext; 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    _activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), REQUEST_CODE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    Log.d("AndroidGalleryPlugin", "onActivityResult"); 
} 

// And to convert the image URI to the direct file system path of the image file 
public String getRealPathFromURI(Uri contentUri) { 

    Log.d("AndroidGalleryPlugin", "Get URI"); 
} 

Добавлен onCreate метод, который я получаю текущую деятельность Unity от там. Кроме того, методы конструктора не нужны для вашего класса с момента его активности.

Для Unity, поскольку вы переопределяете свою деятельность, вам просто нужно получить свой класс unionplayer, а не экземпляр! Просто используйте этот код.

unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
unityObj = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); 

if(unityObj == null) 
{ 
    Debug.LogError ("Unity Obj Null"); 
    return false; 
} 

unityObj.CallStatic("StartOpenGallery"); 
+0

Спасибо за ваше предложение. Любая идея, как решить главную проблему? – KennethLJJ

+0

Привет @nexx, я последовал твоему предложению и удалил экземпляр. Тем не менее, я предпочитаю исключить статический метод «StartOpenGallery» в классе UnityPlayerNativeActivity. О, я забыл упомянуть, я использую некоторые плагины от Prime31. – KennethLJJ

+0

О, я не могу сказать о плагинах Prime31, которые раньше не использовались. Но, может быть, ваша проблема связана с вашим файлом AndroidManifest. Добавили ли вы свой AndroidGalleryPlugin в свой манифест и отметили его как запуска? – nexx