【Android】【Unity】ギャラリーから画像を持ってきたい その1
やりたいこと
・Android端末のギャラリーから画像を取得して表示したい
開発環境はMAC
Unity5.3.4f1
AndroidStudio2.2
色々、調べて参考にしたサイト
まずはAndroidStudioでプラグインを作成します。
参考サイト
上記サイトを参考にプラグインを作成しました。
Gradleで作成したaarをコピーする記述ですが、自分のAndroidStudio2.2環境では動かなかったので修正。
task exportAar(type: Copy, dependsOn: assembleRelease) { from('build/outputs/aar/') into('../../../Assets/Plugins/Android/') include('lib-release.aar') rename('lib-release.aar', 'samplegame-lib.aar') }
これをこれに修正
task exportAar(type: Copy) { dependsOn 'assembleRelease' from('build/outputs/aar/') into('../../../Assets/Plugins/Android/') include('lib-release.aar') rename(project.name + '-release.aar', project.name + '-lib.aar') }
ビルドするとき、この、exportAarを実行すればUnityのPlugins/Androidにコピーされます。
では、参考サイト様のコードをそのまま引用して確認します。
Toastを表示するサンプル
AndroidStudio
NativePlugin.java
package com.sample.samplegame.lib; import android.app.Activity; import android.widget.Toast; import com.unity3d.player.UnityPlayer; public class NativePlugin { public static void showToast(final String message) { final Activity activity = UnityPlayer.currentActivity; activity.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(activity, message, Toast.LENGTH_SHORT).show(); } }); } }
Unity
Sample.cs
using UnityEngine; public class Sample : MonoBehaviour { public void OnGUI () { if(GUILayout.Button("Open")){ using (AndroidJavaClass javaCalss = new AndroidJavaClass ("com.sample.samplegame.lib.NativePlugin")) { javaCalss.CallStatic ("showToast", "Test"); } } } }
Androidの実機を繋げて確認
GUIボタンを押すとToastが表示されました。
では本題です。
まずはギャラリーを表示できるように試してみます。
AndroidStudioで新規作成でActivityを作成します。
後でAndoridManifest.xmlが必要になるため・・・
AndroidStudio
GalleryActivity.java
package com.sample.samplegame.lib; import android.app.Activity; import android.content.Intent; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; import static android.content.ContentValues.TAG; public class GalleryActivity extends Activity { private static final int SDKVER_KITKAT = 19; private static final int REQUEST_GALLERY_KITKAT_ABOVE = 0; private static final int REQUEST_GALLERY_JELLYBEAN_BELOW = 1; public static void OpenGallery() { final Activity activity = UnityPlayer.currentActivity; activity.runOnUiThread(new Runnable() { @Override public void run() { Intent intent = new Intent(); intent.setType("image/*"); if (Build.VERSION.SDK_INT < SDKVER_KITKAT) { intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); activity.startActivityForResult(intent, REQUEST_GALLERY_JELLYBEAN_BELOW); } else { intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); activity.startActivityForResult(intent, REQUEST_GALLERY_KITKAT_ABOVE); } } }); } }
Unity
Sample.cs
下記のように変更
public class Sample : MonoBehaviour { public void OnGUI () { if(GUILayout.Button("Open")){ using (AndroidJavaClass javaCalss = new AndroidJavaClass ("com.sample.samplegame.lib.NativePlugin")) { javaCalss.CallStatic ("OpenGallery"); } } } }
実機でギャラリーが表示されたのを確認。
次は、ギャラリーで選択した画像のパスを取得してみる。
startActivityForResultで起動すると結果が
onActivityResultに返ってくるということなので
AndroidStudio
GalleryActivity.java
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult: " + requestCode + " : " + resultCode); super.onActivityResult(requestCode, resultCode, data); }
を追加しました。
実機で確認しましたが、ログが表示されません・・・
こちらの参考サイトでも、onActivityResultが呼ばれなかったらしい。
UnityPlayerActivity.javaをマージしなくてはいけない・・・?
色々他に方法はないのか調べてみました。
やっとのおもいでたどり着いたのはここでした。
自分がやった対応は以下のようなものです。
AndroidStudio
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.samplegame.lib"> <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> <activity android:name=".GalleryActivity"> <intent-filter> <action android:name="androidnativeactions.Gallery" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
マニュフェストファイルをこのように変更。
AndroidStudio
GalleryActivity.java
public static void OpenGallery() { Intent intent = new Intent(); intent.setAction("androidnativeactions.Gallery"); UnityPlayer.currentActivity.startActivityForResult(intent, 999);//999は適当? }
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(); intent.setType("image/*"); if (Build.VERSION.SDK_INT < SDKVER_KITKAT) { intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, REQUEST_GALLERY_JELLYBEAN_BELOW); } else { intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, REQUEST_GALLERY_KITKAT_ABOVE); } }
protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult: " + requestCode + " : " + resultCode); super.onActivityResult(requestCode, resultCode, data); setResult(resultCode);//追加 finish();//追加 }
これを実機でおこなうと
onActivityResultのログが表示されました。
長い道のりです・・・