[TUTO]Android: appel fonctions natives (ex : share, vibrate)

Tous les tutoriaux unity, de la communauté ou d'ailleurs.
Triss
Messages : 6
Inscription : 19 Sep 2013 17:19

[TUTO]Android: appel fonctions natives (ex : share, vibrate)

Message par Triss » 24 Oct 2013 15:18

Salut
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);
	}
Commençons par récupérer les différentes classes Android nécéssaires aux méthodes et attributs statiques grâce à AndroidJavaClass :

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 doc android vous permet de trouver facilement le chemin d'accès des classes java à placer comme paramètre du constructeur : http://developer.android.com/reference/packages.html

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.
Pour l'appel des méthode et la récupération d'atrribut d'un objet ça se corse un peu :

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);
}
Voila voila, vous pouvez maintenant appelez toutes les méthodes Android java depuis votre code Unity de la même façon.
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);
Dernière édition par Triss le 25 Oct 2013 14:16, édité 3 fois.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [TUTO]Android: appel fonctions natives (ex : share, vibr

Message par ZJP » 24 Oct 2013 19:56

Woo!!! Merci. 8-)

Triss
Messages : 6
Inscription : 19 Sep 2013 17:19

Re: [TUTO]Android: appel fonctions natives (ex : share, vibr

Message par Triss » 26 Oct 2013 12:55

De rien. J'en ai tellement chié pour faire un partage d'image natif à mon taf, aucun plug-in ne le propose.
Zjp tu étais pas sur le forum de blitz3dfr dans le temps ?

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [TUTO]Android: appel fonctions natives (ex : share, vibr

Message par ZJP » 26 Oct 2013 14:58

Triss a écrit :De rien. J'en ai tellement chié pour faire un partage d'image natif à mon taf, aucun plug-in ne le propose.
Zjp tu étais pas sur le forum de blitz3dfr dans le temps ?
Oui. L'avatar est le même. :D
Quelques anciens de Blitz ici. (Icare et Filax) 8-)

Répondre

Revenir vers « Tutoriaux »