【问题标题】:Permission in native interface (android) issue本机界面(android)问题中的权限
【发布时间】:2017-08-09 20:13:54
【问题描述】:

在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();
}

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;
}

调试

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 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;
}

【问题讨论】:

    标签: codenameone


    【解决方案1】:

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

    通常不会到达此代码,因为您将有一个当前表单处于暂停状态,但您甚至没有给它足够的时间来实现。

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

    没有显示 UI,如果用户说不,你就会被卡住。您需要显示上下文,然后请求用户许可。

    【讨论】:

    • 实际上权限在 btn 动作监听器中。我要求 ACCESS_FINE_LOCATION 使用融合位置。以上只是一个例子。请查看上面的 update1。谢谢你
    • 您是否也将权限添加到 android.xpermissions 构建提示?如果被用户拒绝,为什么要再次提示许可?我们已经这样做了,如果你也这样做,它看起来会很糟糕。
    • 哦,谢谢...我忘了添加 android.xpermissions 提示。如果权限被用户拒绝,我不知道该返回什么,所以再次询问。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2021-11-16
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多