当前位置: 首页 > 知识库问答 >
问题:

AppCompatActivity中未调用onRequestPermissionResult

沈俊明
2023-03-14
public class LauncherActivity extends AppCompatActivity {
    public static final String TAG = LauncherActivity.class.getSimpleName();
    private boolean permissionsGiven;

    private static final String[] REQUIRED_PERMISSIONS =
            new String[] {
                    Manifest.permission.BLUETOOTH,
                    Manifest.permission.BLUETOOTH_ADMIN,
                    Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.CHANGE_WIFI_STATE,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
            };

    private static final int REQUEST_CODE_REQUIRED_PERMISSIONS = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launcher);

        if (!hasPermissions(this, REQUIRED_PERMISSIONS)) {
            permissionsGiven = false;
            Log.d(TAG, "onCreate: app does not have all the required permissions. Requesting permissions...");

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ActivityCompat.requestPermissions(
                        this,
                        REQUIRED_PERMISSIONS,
                        REQUEST_CODE_REQUIRED_PERMISSIONS
                );
            }
        } else {
            permissionsGiven = true;
        }

        Runnable enterApplication = new Runnable() {
            @Override
            public void run() {
                while (!permissionsGiven);

                SharedPreferences loginPreferences = getApplicationContext().getSharedPreferences("LOGIN_DETAILS", MODE_PRIVATE);

                boolean signedIn = loginPreferences.getBoolean("signedIn", false);

                if (!signedIn) {
                    Log.d(TAG, "onCreate: user is not signed in. Sending him to login activity...");
                    sendUserToLoginActivity();
                } else {
                    sendUserToMainActivity();
                }
            }
        };

        Handler launcherHandler = new Handler();
        launcherHandler.postDelayed(enterApplication, 1500);
    }

    private static boolean hasPermissions(Context context, String... permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }

        return true;
    }

    @CallSuper
    @Override
    public void onRequestPermissionsResult(
            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode != REQUEST_CODE_REQUIRED_PERMISSIONS) {
            return;
        }

        permissionsGiven = true;

        for (int grantResult : grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                Toast.makeText(this, "Missing permissions", Toast.LENGTH_LONG).show();
                finish();
                return;
            }
        }

        recreate();
    }

    private void sendUserToLoginActivity() {
        Log.d(TAG, "sendUserToLoginActivity: starting login activity...");
        Intent loginIntent = new Intent(LauncherActivity.this, SignInActivity.class);
        loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(loginIntent);
        finish();
    }

    private void sendUserToMainActivity() {
        Log.d(TAG, "sendUserToMainActivity: starting main activity...");
        Intent mainIntent = new Intent(LauncherActivity.this, MainActivity.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(mainIntent);
        finish();
    }
}

谁能帮助我理解我做错了什么,以及我如何触发onRequestPermissionsResult,以便我可以在应用程序中启动下一个活动?

共有1个答案

薛滨海
2023-03-14

再创造();

我从没见过那种方法。

不要把它称为测试,而是举杯。

 类似资料:
  • 我有一个扩展AppCompatActivity的活动(MainActivity),因为我在应用程序中使用了一些材质设计元素。 然后我有一个带有几个字段和一个按钮的数组适配器。此适配器具有单独的视图并被注入到我的Mainactive布局中。 当我单击适配器视图上的按钮时,我想打开一个显示一堆文本的新片段,但是,我似乎无法做到这一点,我认为这是因为我没有在我的MainActive中扩展Fragment

  • 问题内容: 如果从调用, 则会 收到消息 “套接字已连接” ,但未调用。我在这里想念什么? 问题答案: 在AngularJS中,承诺结果在$ digest周期内异步传播。因此,仅在进入$ digest循环时才调用在then()中注册的回调函数。 因此,当您的套接字连接时,我们处于摘要周期。 创建一个新的Promise,但是直到下一个摘要周期(永远不会到来的摘要周期)之前,它的结果才会传播(因为没有

  • 错误是: 错误:(50,17)错误:没有为startActivities(Intent)方法Activity找到合适的方法。startActivities(Intent[],Bundle)不适用(实际和正式的参数列表长度不同)方法Activity.startActivities(Intent[])方法上下文twrapper.startactivities(Intent[],Bundle)不适用(实

  • 问题内容: 我有一个简单的程序,其中显示了一些项目的列表,单击其中的一个后,单击的项目将传递回附件。当用户取消对话框时,我还想执行一些默认处理(使用 后退按钮 )-更具体地说,在这种情况下,我想向活动传递一个空字符串。 但是,如果将对话框放在(来自 兼容性包 )中, 则使用后退按钮关闭对话框时不会调用 。我究竟做错了什么? 问题答案: 这可能与您的代码中没有显式调用的事实有关。该OnCancelL

  • 问题内容: 实例化ArrayAdapter时,我收到以下警告(编译正常): 这是问题所在: 有人对它为什么给我这个警告有任何想法吗? 问题答案: 这是因为希望您指定它将处理的对象类型。因此,为了避免这些警告,请执行以下操作:

  • 问题内容: 我知道有人问过这个问题,但是我遵循了所有答案,但仍然有同样的问题。我有两个脚本,一个是片段管理器(IngredientsActivity),另一个是片段(OtherList)。代码如下 成分活动 其他清单 我发现有多个建议可以覆盖onSaveInstanceState的建议,并且我发现更多建议告诉我使用setRetainInstance。我不知道如果要保存列表的值,为什么setReta