1
votes

I need a permission while writing the native android code in cn1. But the following code doesn't ask for permission but gives blank screen. While debugging, the 2nd part of debugging mentioned below repeats infinitely.

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

While debugging, the following lines repeat infinitely

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

Updated1

public class FusedLocationImpl implements 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;
}
1

1 Answers

0
votes

Start happens every time the app is started. You are asking for permission which opens a native dialog to prompt for permission. App gets suspended. App gets restored and you ask for permission again...

Normally this code wouldn't be reached because you would have a current form on suspend but you didn't even give enough time for that to happen.

Asking for permissions at this stage is BAD, in native and Codename One apps.

No UI is showing and if the user says no you are stuck. You need a context to show and then ask the user for permission.