安卓从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 楼答案
我最终通过以下方式在主循环中运行请求权限来处理此问题: