2017-08-08 2 views
1

J'ai besoin d'une autorisation lors de l'écriture du code android natif dans cn1. Mais le code suivant ne demande pas la permission mais donne un écran vide. Lors du débogage, la 2ème partie du débogage mentionnée ci-dessous se répète à l'infini.Autorisation dans l'interface native (android) issue

import android.Manifest; 
import android.support.v4.app.ActivityCompat; 
import android.util.Log; 
import com.codename1.impl.android.AndroidNativeUtil; 

public class FusedLocationImpl implements ConnectionCallbacks, 
     OnConnectionFailedListener{ 

    public boolean isSupported() { 
     return true; 
    } 

    public void getFusedLocationPermission() { 
     if (!com.codename1.impl.android.AndroidNativeUtil.checkForPermission(Manifest.permission.CAMERA, "Please allow camera permission")) { 
      ActivityCompat.requestPermissions((android.app.Activity) MyApplication.getContext(), new String[]{Manifest.permission.CAMERA}, 0); 
      //commenting this line does nothing 
     } 
    } 
} 

FusedLocation.java

public interface FusedLocation extends NativeInterface{ 
    public void getFusedLocationPermission(); 
} 

MyApplication.java

public void start() { 
    if (current != null) { 
     current.show(); 
     return; 
    } 
    FusedLocation my = (FusedLocation) NativeLookup.create(FusedLocation.class); 
    if(my != null && my.isSupported()){ 
     my.getFusedLocationPermission(); 
     System.out.println("bbeck"); 
    } 
    Form hi = new Form("Hi World", BoxLayout.y()); 
    hi.add(new Label("Hi World")); 
    hi.show(); 
} 

public static Object getContext() { 
    return context; 
} 

Debugging

08-08 14:56:49.161: W/ResourcesManager(4437): Resource getTopLevelResources for package com.fusedLocation.myappoverlayDirs =Null 
08-08 14:56:49.171: W/System(4437): ClassLoader referenced unknown path: /data/app/com.fusedLocation.myapp-1/lib/arm 
08-08 14:56:49.181: D/ContextRelationManager(4437): ContextRelationManager() : FEATURE_ENABLED=true 
08-08 14:56:49.231: I/GMPM(4437): App measurement is starting up 
08-08 14:56:49.241: E/GMPM(4437): getGoogleAppId failed with status: 10 
08-08 14:56:49.241: E/GMPM(4437): Uploading is not possible. App measurement disabled 
08-08 14:56:49.261: E/Qmage(4437): isQIO : stream is not a QIO file 
08-08 14:56:49.261: E/Qmage(4437): isQIO : stream is not a QIO file 
08-08 14:56:49.261: E/Qmage(4437): isQIO : stream is not a QIO file 
08-08 14:56:49.311: D/SecWifiDisplayUtil(4437): Metadata value : SecSettings2 
08-08 14:56:49.311: D/ViewRootImpl(4437): #1 mView = com.android.internal.policy.PhoneWindow$DecorView{a207dc I.ED..... R.....ID 0,0-0,0} 
08-08 14:56:49.311: D/OpenGLRenderer(4437): Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
08-08 14:56:49.331: W/ActivityThread(4437): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:56:49.361: I/Codename One(4437): Resource not found: theme_phone.ovr 
08-08 14:56:49.361: I/Codename One(4437): Resource not found: theme_android.ovr 
08-08 14:56:49.361: I/Codename One(4437): Resource not found: theme_android-phone.ovr 
08-08 14:56:49.361: D/libEGL(4437): eglInitialize EGLDisplay = 0xddf077c4 

Bien que le débogage, les lignes suivantes répéter à l'infini

08-08 14:17:26.871: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:26.871: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41788755 
08-08 14:17:26.991: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:26.991: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41788872 
08-08 14:17:27.071: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.071: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41788957 
08-08 14:17:27.171: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789058 
08-08 14:17:27.171: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.371: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.371: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789256 
08-08 14:17:27.491: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.491: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789373 
08-08 14:17:27.591: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.591: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789475 
08-08 14:17:27.761: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.761: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789640 
08-08 14:17:27.871: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.871: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789757 
08-08 14:17:27.971: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:27.971: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789857 
08-08 14:17:28.071: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.071: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41789958 
08-08 14:17:28.141: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.141: I/Timeline(29413): Timeline: Activity_idle id: android.os.Bin[email protected] time:41790025 
08-08 14:17:28.241: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.241: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41790125 
08-08 14:17:28.341: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.341: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41790227 
08-08 14:17:28.441: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.441: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41790325 
08-08 14:17:28.541: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.541: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41790426 
08-08 14:17:28.641: W/ActivityThread(29413): AppLock checkAppLockState isAppLocked = false pkgName = com.fusedLocation.myapp showWhenLocked = false 
08-08 14:17:28.641: I/Timeline(29413): Timeline: Activity_idle id: [email protected] time:41790526 

Updated1

public class FusedLocationImpl implémente ConnectionCallbacks, OnConnectionFailedListener {

public boolean isSupported() { 
    return true; 
} 

public void getFusedLocationPermission() { 
    if (!com.codename1.impl.android.AndroidNativeUtil.checkForPermission(Manifest.permission.ACCESS_FINE_LOCATION, "Please allow location permission")) { 
     // you didn't get the permission, you might want to return here 
     ActivityCompat.requestPermissions((android.app.Activity) MyApplication.getContext(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0); 
    } 
} 

}

FusedLocation.java

public interface FusedLocation extends NativeInterface{ 
     public void getFusedLocationPermission(); 
     public void fusedLocation(); 
} 

MyApplication.java

public void start() { 
    if (current != null) { 
     current.show(); 
     return; 
    } 
    Form hi = new Form("Hi World", BoxLayout.y()); 
    hi.show(); 

    Button btn = new Button("ask for permission"); 
    btn.addActionListener(e -> { 
     FusedLocation my = (FusedLocation) NativeLookup.create(FusedLocation.class); 
     if (my != null && my.isSupported()) { 
      my.getFusedLocationPermission(); 
      my.fusedLocation(); 
     } 
    }); 
    hi.add(btn); 
} 

public static Object getContext() { 
    return context; 
} 

Répondre

0

Démarrer arrive à chaque fois que l'application est lancée. Vous demandez une autorisation qui ouvre une boîte de dialogue native pour demander l'autorisation. L'application est suspendue L'application est restaurée et vous demandez à nouveau l'autorisation ...

Normalement, ce code ne serait pas atteint car vous auriez un formulaire en cours de suspension mais vous n'avez même pas donné assez de temps pour que cela se produise.

Demander des autorisations à ce stade est BAD, dans les applications natives et Codename One.

Aucune interface utilisateur ne s'affiche et si l'utilisateur répond non, vous êtes bloqué. Vous avez besoin d'un contexte pour montrer, puis demander à l'utilisateur la permission.

+0

En fait, l'autorisation est à l'intérieur d'un programme d'écoute d'action btn. Je demande à ACCESS_FINE_LOCATION d'utiliser l'emplacement fusionné. Ci-dessus était juste un exemple. S'il vous plaît jeter un oeil à update1 ci-dessus. Thankyou – beck

+1

Avez-vous ajouté l'autorisation à l'indice de construction android.xpermissions aussi? Pourquoi demandez-vous à nouveau l'autorisation si l'utilisateur le refuse? Nous faisons déjà cela et ça ne sera pas bien si vous le faites aussi. –

+0

ohhh merci ... j'ai oublié d'ajouter l'indice android.xpermissions. Je ne sais pas quoi retourner si l'autorisation est refusée par l'utilisateur, donc à nouveau demandé. – beck