2016-10-28 1 views
2

Je suis nouveau ici et raison pour laquelle je ne connais pas encore toutes les règles du site, désolé à ce sujet!Comment demander des autorisations pendant l'exécution lors de l'utilisation de l'environnement mobile Gluon?

Je construis une application Java sur Desktop et Android en utilisant le plugin mobile Gluon dans l'outil Eclipse. J'ai varié le code pour Desktop et Android comme décrit dans un exemple (http://docs.gluonhq.com/samples/gonative/). J'ai donc NativeService spécifique à Android où j'ai une méthode pour lire les fichiers de stockage externe (qui fonctionne). J'ai également étudié comment demander des autorisations sur l'exécution lors de l'utilisation de l'environnement Android natif (Storage permission error in Marshmallow). Je suis en mesure de demander la permission, mais je ne peux pas attraper le résultat.

Je demande maintenant les autorisations de la même manière, mais comment puis-je recevoir les résultats? Je ne peux pas surcharger onRequestPermissionsResult comme dans l'exemple, parce que je n'ai pas directement disponible trucs android.support.v4.app. Quelqu'un pourrait-il m'aider et donner un exemple?

AndroidNativeService.java:

package com.tentaattorix; 

import java.io.IOException; 

import java.io.File; 
import android.os.Environment; 
import android.media.MediaScannerConnection; 
import android.net.Uri; 
import android.content.Context; 
import javafxports.android.FXActivity; 
import android.util.Log; 
import android.widget.Toast; 
import android.content.pm.PackageManager; 
import android.os.Build; 
import com.avustajat.LueJaKirjoita; 

/** 
* Sanaston luku: Android-natiivi toteutus! 
* @author PT 
* @version 24.10.2016 
* 
*/ 
public class AndroidNativeService implements NativeService { 

    private static final String TAG = "Tentaattorix Native Service"; 
    private Sanastot sanastot = new Sanastot(); 

    private static final int MY_PERMISSIONS_USE_EXTERNAL_STORAGE = 1; 
    public AndroidNativeService() { 
     // 
    } 

    @Override 
    public Sanastot haeSanastot(String juuriKansio, String sanastoRegex, char kommentti, char erotin) throws IOException { 


     String polku = Environment.getExternalStorageDirectory().toString(); 
     String readme = "LueMinut.txt"; 
     String kansioPolku =""; 

     //Luodaan kansio, jos sitä ei vielä ole. 
     File kansio = new File(polku, juuriKansio); 
     kansio.mkdir(); 

     //Asetetaan oikeudet, jos vaikka auttais skannaukseen. 
     kansio.setWritable(true); 
     kansio.setReadable(true); 
     kansio.setExecutable(true); 
     kansioPolku = kansio.getAbsolutePath(); 


     //Kysy oikeudet, jos niitä ei ole!          
     if (isStoragePermissionGranted()) { 

      //Luodaan kansioon tiedosto LueMinut.txt. 
      try { 
       LueJaKirjoita.luoLueMinut(kansioPolku, readme); 
      } 
      catch (IOException e){ 
       throw e; 
      } 

      //Informoidaan uudesta kansiosta ja sinne tulevista tiedostoista järjestelmää! 
      scanFile(kansioPolku + File.separator + readme); 


      //Luetaan sanastot kansiosta. 
      sanastot = LueJaKirjoita.lueTiedostot(kansioPolku, sanastoRegex, kommentti, erotin); 

     } 

     // Jos sanastot ei sisällä yhtään sanastoa, 
     // niin laitetaan edes yksi :) 
     if (sanastot.annaLkm() < 1) { 
      String[] rivix = {"Tyhjä sanasto!", "Empty glossary!"}; 
      Sanasto san = new Sanasto("sanasto_"); 
      san.lisaa(rivix); 
      sanastot.lisaa(san); 
     } 
     return sanastot; 
    } 

    /** 
    * //Informoidaan uudesta kansiosta ja sinne tulevista tiedostoista järjestelmää! 
    * @param path lisätty polku+tiedosto 
    */ 
    private void scanFile(String path) { 

     MediaScannerConnection.scanFile(FXActivity.getInstance().getApplicationContext(), 
       new String[] { path }, null, 
       new MediaScannerConnection.OnScanCompletedListener() { 

      public void onScanCompleted(String path, Uri uri) { 
       Log.i("TAG", "Finished scanning " + path); 
      } 
     }); 
    } 

    private boolean isStoragePermissionGranted() { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (FXActivity.getInstance().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        == PackageManager.PERMISSION_GRANTED) { 
       Log.v(TAG,"Permission is granted"); 
       return true; 
      } else { 

       Log.v(TAG,"Permission is revoked"); 
       FXActivity.getInstance().requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_USE_EXTERNAL_STORAGE); 
       return false; 
      } 
     } 
     else { //permission is automatically granted on sdk<23 upon installation 
      Log.v(TAG,"Permission is granted"); 
      return true; 
     } 
    } 
} 

Répondre

3

Pour commencer, vous pouvez ajouter le android-support-v4.jar à votre projet:

Copier de son emplacement sous ANDROID_HOME/extras/android/support/v4/android-support -v4.jar dans un dossier libs dans votre projet, puis ajoutez la dépendance au fichier build.gradle:

dependencies { 
    androidCompile files('libs/android-support-v4.jar') 
} 

supposant que vous êtes Targ Android SDK 23+:

android { 
     minSdkVersion '23' 
     compileSdkVersion '23' 
     targetSdkVersion '23' 
     manifest = 'src/android/AndroidManifest.xml' 
    } 

alors vous savez que toutes les autorisations incluses dans le manifeste seront désactivées par défaut. Si vous souhaitez vérifier les autorisations sur l'exécution, vous pouvez définir une nouvelle activité qui s'occupe des demandes d'autorisations avec une boîte de dialogue intégrée (en utilisant ActivityCompat.requestPermissions), enregistrez cette activité dans le manifeste et appelez-la depuis FXActivity dans une nouvelle intention qui passe une liste avec les autorisations requises.

Vous avez juste besoin d'appeler FXActivity.getInstance().setOnActivityResultHandler() pour écouter la fin de cette activité et reprendre l'appel si les autorisations ont été accordées.

Le code suivant est partiellement basé sur PermissionHelper class.

Je vais utiliser le cas simple du service Dialer à partir du nouveau Charm Down 3.0.0 library, qui nécessite Manifest.permission.CALL_PHONE.

AndroidDialerService.java, sous package Android

public class AndroidDialerAskService implements DialerAskService { 

    public static final String KEY_PERMISSIONS = "permissions"; 
    public static final String KEY_GRANT_RESULTS = "grantResults"; 
    public static final String KEY_REQUEST_CODE = "requestCode"; 

    @Override 
    public void call(String number) { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (ContextCompat.checkSelfPermission(FXActivity.getInstance(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
       FXActivity.getInstance().setOnActivityResultHandler((requestCode, resultCode, data) -> { 
        if (requestCode == 11112) { 
         // if now we have permission, resume call 
         if (ContextCompat.checkSelfPermission(FXActivity.getInstance(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { 
          call(number); 
         } 
        } 
       }); 

       Intent permIntent = new Intent(FXActivity.getInstance(), PermissionRequestActivity.class); 
       permIntent.putExtra(KEY_PERMISSIONS, new String[]{Manifest.permission.CALL_PHONE}); 
       permIntent.putExtra(KEY_REQUEST_CODE, 11111); 
       FXActivity.getInstance().startActivityForResult(permIntent, 11112); 
       return; 
      } 
     } 

     if (number != null && !number.isEmpty()) { 
      Uri uriNumber = Uri.parse("tel:" + number); 
      Intent dial = new Intent(Intent.ACTION_CALL, uriNumber); 
      FXActivity.getInstance().startActivity(dial); 
     } 
    } 

    public static class PermissionRequestActivity extends Activity { 
     private String[] permissions; 
     private int requestCode; 

     @Override 
     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
      FXActivity.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults); 
      finish(); 
     } 

     @Override 
     protected void onStart() { 
      super.onStart(); 
      permissions = this.getIntent().getStringArrayExtra(KEY_PERMISSIONS); 
      requestCode = this.getIntent().getIntExtra(KEY_REQUEST_CODE, 0); 

      ActivityCompat.requestPermissions(this, permissions, requestCode); 
     } 
    } 
} 

AndroidManifest.xml

. . . 
<uses-permission android:name="android.permission.CALL_PHONE"/> 
. . . 
<activity android:name="javafxports.android.FXActivity" .../> 
<activity android:name="com.gluonhq.charm.down.plugins.android.AndroidDialerService$PermissionRequestActivity" /> 
. . . 

+0

ce qui ne signifie en 11112 ** AndroidDialerService.java **? @JosePereda –

+1

@ guru_007 C'est juste un 'requestCode 'aléatoire, qui est passé à' startActivityForResult (Intent intention, int requestCode) ', pour vérifier que' setOnActivityResultHandler' est exécuté uniquement pour un Intent avec ce code. –

+0

J'ai compris! @ José Pereda! –