有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓从Java线程调用JNI并返回requestPermissions

我有以下问题。 我在一个永远循环的线程中有一个Java函数,然后一个JNIAPI最终调用另一个类中的静态函数。 此静态函数试图调用requestPermissions以显示请求权限弹出窗口,当用户接受或拒绝时,此线程休眠。弹出窗口显示,用户可以响应,但从未调用函数onRequestPermissionsResult。 有没有办法解决这个问题

我做错了什么

我的意思是,如果我不在UI线程上睡觉,这应该不会阻止它,对吗? 弹出窗口正在显示,但答案从未出现

这是主要活动。java

public class MainActivity extends FragmentActivity implements ActivityCompat.OnRequestPermissionsResultCallback {

    class MyThread extends Thread {
        @Override
        public void run() {
            //JNI_CALL();
            MainActivity.AskForPermissionsFromJNI();
        }
    }

    static FragmentActivity myActivityStoredInAStaticVariable;
    static boolean OnRequestPermission=false;
    MyThread mThread;
    @Override
    protected void onCreate(Bundle aSavedInstanceState) {
        mThread = new MyThread();
        myActivityStoredInAStaticVariable = this;
        mThread.start();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults)
    {
         //This function is never called WHY?
         //Do what you need to do
         OnRequestPermission=true;
    }

    public static void AskForPermissionsFromJNI()
    {
        ActivityCompat.requestPermissions(myActivityStoredInAStaticVariable, new String[]{"安卓.permission.GET_ACCOUNTS"} , 1234);

        //Wait until onRequestPermissionsResult ended
        while (!OnRequestPermission) {try { Thread.sleep(100); } catch(Exception e) {}}
    }
}

更新: JNI不是问题的一部分,如果我只是替换静态函数上的JNI调用,也会发生同样的情况 这是JNI。cpp

extern "C" JNIEXPORT void JNICALL Java_com_dle_application_MainActivity_JNI_CALL( JNIEnv* env )
{
    //Call Back to Java
    ...
    dispatch_java_method(AskForPermissionsFromJNI);
    ...
}


共 (1) 个答案

  1. # 1 楼答案

    我最终通过以下方式在主循环中运行请求权限来处理此问题:

    new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        myActivityStoredInAStaticVariable.requestPermissions(new String[]{"android.permission.GET_ACCOUNTS"}, 1234);
                    }
                }
            });