Codenameone 本机界面(android)中的权限问题

Codenameone 本机界面(android)中的权限问题,codenameone,Codenameone,在cn1中编写本机android代码时,我需要一个权限。但是下面的代码没有请求权限,而是给出了一个空白屏幕。调试时,下面提到的第二部分调试会无限重复 import android.Manifest; import android.support.v4.app.ActivityCompat; import android.util.Log; import com.codename1.impl.android.AndroidNativeUtil; public class FusedLocatio

在cn1中编写本机android代码时,我需要一个权限。但是下面的代码没有请求权限,而是给出了一个空白屏幕。调试时,下面提到的第二部分调试会无限重复

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();
}
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;
}
public interface FusedLocation extends NativeInterface{
        public void getFusedLocationPermission();
        public void fusedLocation();
}
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;
}
MyApplication.java

public interface FusedLocation extends NativeInterface{
    public void getFusedLocationPermission();
}
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;
}
public interface FusedLocation extends NativeInterface{
        public void getFusedLocationPermission();
        public void fusedLocation();
}
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;
}
调试

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
调试时,以下几行无限重复

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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 time:41788957
08-08 14:17:27.171: I/Timeline(29413): Timeline: Activity_idle id: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 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: android.os.BinderProxy@c078698 time:41790526
更新1

公共类FusedLocationImpl实现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 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;
}
public interface FusedLocation extends NativeInterface{
        public void getFusedLocationPermission();
        public void fusedLocation();
}
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;
}
MyApplication.java

public interface FusedLocation extends NativeInterface{
    public void getFusedLocationPermission();
}
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;
}
public interface FusedLocation extends NativeInterface{
        public void getFusedLocationPermission();
        public void fusedLocation();
}
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;
}

每次启动应用程序时都会启动。您正在请求权限,这将打开一个本机对话框以提示您请求权限。应用程序被暂停。应用程序被还原,您再次请求许可

通常不会访问此代码,因为您将有一个当前表单处于挂起状态,但您甚至没有给足够的时间让它发生

在本机和Codename One应用程序中,在此阶段请求权限是错误的


没有显示用户界面,如果用户说没有,您就卡住了。您需要显示上下文,然后向用户请求权限。

每次启动应用程序时都会启动。您正在请求权限,这将打开一个本机对话框以提示您请求权限。应用程序被暂停。应用程序被还原,您再次请求许可

通常不会访问此代码,因为您将有一个当前表单处于挂起状态,但您甚至没有给足够的时间让它发生

在本机和Codename One应用程序中,在此阶段请求权限是错误的


没有显示用户界面,如果用户说没有,您就卡住了。您需要一个上下文来显示,然后向用户请求权限。

实际上,权限在btn操作侦听器中。我请求访问\u FINE\u位置以使用融合位置。以上只是一个例子。请查看上面的更新1。谢谢您是否也向android.xpermissions构建提示添加了权限?如果被用户拒绝,为什么要再次提示您获得权限?我们已经这么做了,如果你也这么做的话,那就不好看了。。。我忘了添加android.xpermissions提示。如果用户拒绝了权限,我不知道返回什么,所以再次询问。实际上,权限在btn操作侦听器中。我请求访问\u FINE\u位置以使用融合位置。以上只是一个例子。请查看上面的更新1。谢谢您是否也向android.xpermissions构建提示添加了权限?如果被用户拒绝,为什么要再次提示您获得权限?我们已经这么做了,如果你也这么做的话,那就不好看了。。。我忘了添加android.xpermissions提示。如果用户拒绝了权限,我不知道返回什么,所以再次询问。