Il y a toute une flopée de plugins pour Unity permettant d'accéder aux fonctionnalités propres à Android.
Néanmoins ces plugins coûtent plus ou moins cher et parfois vous en trouverez aucun implémentant les méthodes dont vous avez besoin.
Afin d'alléger vos dépenses et accéder à des fonctionnalités avancées de votre téléphone, je vais vous montrer comment accéder aux classes java d'Android depuis Unity grâce à AndroidJavaClass et AndroidJavaObject.
On va partir de ce bout de code en java qui fait apparaitre la boîte de dialogue partager permettant de transférer une image vers l'application de son choix à l'utilisateur. (exemple d'utilisation : partager une image avec facebook)
Code : Tout sélectionner
//path : chemin de l'image png, chooserText : texte de la boîte de dialogue de partage
public void shareImage(String path, String chooserText) {
File f = new File(path);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
shareIntent.setType("image/png");
startActivity(Intent.createChooser(shareIntent, chooserText);
}
Code : Tout sélectionner
public void ShareImage(string path, string chooserText) {
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaClass Intent = new AndroidJavaClass("android.content.Intent");
AndroidJavaClass Uri = new AndroidJavaClass("android.net.Uri");
La création d'un objet AndroidJavaObject se fait selon la syntaxe suivante :
Code : Tout sélectionner
AndroidJavaObject shareIntent = new AndroidJavaObject("android.content.Intent");// le premier paramètre est l'emplacement de la classe de l'objet à créer
AndroidJavaObject file = new AndroidJavaObject("java.io.File", path); //les autres paramètres sont ceux du constructeur de l'objet java.
void AndroidJavaObject.Call(string methodName, params object[] args) permet d'appeler la fonction retournant void nommée methodName, liée à l'objet java. Les arguments peuvent être de type basiques : int, float, string..etc ou des AndroidJavaObject
Type AndroidJavaObject.Call<Type>(string methodName, params object[] args) permet d'appeler une fonction retournant une valeur du type entre croché. Mettez AndroidJavaObject comme type retourné lorsque la fonction retourne un type non basique. Sinon Int, String, ou Float..etc
Attention : même si la fonction retourne quelque chose et que vous ne le récupérez pas, vous devez quand même indiquer son type retourné sinon elle ne sera pas reconnue.
Type AndroidJavaClass.CallStatic<Type>(string methodName, params object[] args) permet d'appeler une fonction statique d'une classe Android, renseignez Type de la même manière que pour Call.
Type AndroidJavaClass.GetStatic<Type>(string argName) retourne la valeur d'un attribut statique
Voici maintenant le code complet :
Code : Tout sélectionner
public void shareImage(String path, String chooserText) {
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaClass Intent = new AndroidJavaClass("android.content.Intent");
AndroidJavaClass Uri = new AndroidJavaClass("android.net.Uri");
AndroidJavaObject shareIntent = new AndroidJavaObject("android.content.Intent");
AndroidJavaObject file = new AndroidJavaObject("java.io.File", path);
AndroidJavaObject activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
shareIntent.Call<AndroidJavaObject>("setAction",Intent.GetStatic<string>("ACTION_SEND"));
shareIntent.Call<AndroidJavaObject>("putExtra", Intent.GetStatic<string>("EXTRA_STREAM"), Uri.CallStatic<AndroidJavaObject>("fromFile",file));
shareIntent.Call<AndroidJavaObject>("setType", "image/png");
AndroidJavaObject chooser = Intent.CallStatic<AndroidJavaObject>("createChooser", shareIntent, chooserText);
activity.Call("startActivity", chooser);
}
Par exemple pour faire vibrer votre appareil pendant 2 secondes :
Code : Tout sélectionner
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject Vibrator = activity.Call<AndroidJavaObject>("getSystemService", activity.GetStatic<string>("VIBRATOR_SERVICE"));
long time = 2000;
Vibrator.Call("vibrate", time);