首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android在主活动前检查权限

Android在主活动前检查权限
EN

Stack Overflow用户
提问于 2017-02-08 16:32:59
回答 3查看 5.9K关注 0票数 2

在我的应用程序中,我实现了一个启动活动,检查是否是首次运行的应用程序,如果为真,则显示一个对话框消息,这是代码:

代码语言:javascript
复制
 public void onConnected(Bundle connectionHint) {
    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        myLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    }
    SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    boolean isFirstStart = getPrefs.getBoolean("firstStart", true);
    if (isFirstStart) {
        android.app.AlertDialog alertDialog = new android.app.AlertDialog.Builder(splashscreen.this).create();
        alertDialog.setTitle(getResources().getString(R.string.titolo_intro_sms));
        alertDialog.setMessage(getResources().getString(R.string.intro_sms));
        alertDialog.setButton(android.app.AlertDialog.BUTTON_NEUTRAL, "OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                        Intent i = new Intent(splashscreen.this, MainActivity.class);
                        startActivity(i);

                    }
                });
        alertDialog.show();

        SharedPreferences.Editor e = getPrefs.edit();
        e.putBoolean("firstStart", false);
        e.apply();
    } else {

        startApp();
    }
}

当对话框显示时,如果单击“确定”,则打开MainActivity。现在,在“确定”之后,单击“进入”对话框,然后启动MainActivity,我想显示一个对话框请求权限。我已经为此创建了一个抽象类,并以这样的方式调用:

代码语言:javascript
复制
requestAppPermissions(new String[]{
                                        Manifest.permission.ACCESS_COARSE_LOCATION},
                                R.string.msg,REQUEST_PERMISSION);

现在,我将这行代码设置为OnCreate,权限请求在启动活动之前显示,但如果设置为'ok‘allert对话框的onClick方法,则不会显示。

在单击“确定”启动主活动之前,如何显示权限请求?任何帮助都是非常感谢的。

我已经以这种方式将我的onRequestPermissionresult集成到抽象类中:

代码语言:javascript
复制
 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    for(int permisson : grantResults) {
        permissionCheck = permissionCheck + permisson;
    }

    if( (grantResults.length > 0) && PackageManager.PERMISSION_GRANTED == permissionCheck) {
        onPermissionsGranted(requestCode);
        Intent i = new Intent(this, MainActivity.class); //start activity
        startActivity(i);
    } else {
        //Display message when contain some Dangerous permisson not accept
        Snackbar.make(findViewById(android.R.id.content), mErrorString.get(requestCode),
                Snackbar.LENGTH_INDEFINITE).setAction("ENABLE", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                i.setData(Uri.parse("package:" + getPackageName()));
                i.addCategory(Intent.CATEGORY_DEFAULT);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                startActivity(i);
            }
        }).show();
    }
}

消息权限在“确定”单击后显示,但在应用程序关闭后不打开MainActivity后显示。

我已经更改了我的splashcrenn,并且设置了所有关于permsion的方法,这是代码:

代码语言:javascript
复制
public void onPermissionsGranted(int requestCode) {

}

public void requestAppPermissions(final String[]requestedPermissions, final int stringId, final int requestCode) {
    mErrorString.put(requestCode, stringId);

    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    boolean showRequestPermissions = false;
    for(String permission: requestedPermissions) {
        permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);
        showRequestPermissions = showRequestPermissions || ActivityCompat.shouldShowRequestPermissionRationale(this, permission);
    }

    if (permissionCheck!=PackageManager.PERMISSION_GRANTED) {
        if(showRequestPermissions) {
            Snackbar.make(findViewById(android.R.id.content), stringId, Snackbar.LENGTH_INDEFINITE).setAction("GRANT", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ActivityCompat.requestPermissions(splashscreen.this, requestedPermissions, requestCode);
                }
            }).show();
        } else {

            ActivityCompat.requestPermissions(this, requestedPermissions, requestCode);
        }
    } else {
        onPermissionsGranted(requestCode);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {

        case 1: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
                Intent i = new Intent(splashscreen.this, MainActivity.class); //start activity
                splashscreen.this.startActivity(i);
            } else {
                Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

进入对话框'ok‘单击按钮,我设置如下:

代码语言:javascript
复制
alertDialog.setButton(android.app.AlertDialog.BUTTON_NEUTRAL, "OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(splashscreen.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);

                        /*Intent i = new Intent(splashscreen.this, MainActivity.class);
                        startActivity(i);*/

                    }
                });
        alertDialog.show();

但是当我单击“确定”时,应用程序关闭而不是打开MainActivity。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-08 16:41:37

试试这个:

单击按钮显示权限对话框:

代码语言:javascript
复制
alertDialog.setButton(android.app.AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); //show reuest dialog

                }
            });
    alertDialog.show();

现在在onRequestPermissionsResult()中获取结果并启动MainActivity

代码语言:javascript
复制
 @Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {

        case 1: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getContext(), "Permission granted", Toast.LENGTH_SHORT).show();
                Intent i = new Intent(splashscreen.this, MainActivity.class); //start activity
                startActivity(i);
            } else {
                Toast.makeText(getContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
 }

在抽象类中,传递活动上下文并使用它启动MainActivity

通过上下文:

代码语言:javascript
复制
    class YourAbstractClass{

// variable to hold context
private Context context;

//save the context recievied via constructor in a local variable

public YourAbstractClass(Context context){  //constructor
    this.context=context;
  }
}

在splash活动中,请调用抽象类如下:

代码语言:javascript
复制
YourAbstractClass class = new YourAbstractClass(this); //pass context

现在使用上下文来startActivity

代码语言:javascript
复制
Intent myIntent = new Intent(context, MainActivity.class);
context.startActivity(myIntent);
票数 1
EN

Stack Overflow用户

发布于 2017-02-08 16:35:20

请在单击“确定”后请求权限,但不要立即启动该活动。等待onRequestPermissionResult中的结果,然后在那里启动MainActivity

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 16:54:37

在您的按钮调用中使用if-Use语句

如果您已经拥有权限,那么在If部件中执行MainActivity调用。如果没有,那就在if-else的其他部分请求许可。

现在使用在授予或拒绝权限时调用的OnRequestPermissionResult方法。如果在此方法中授予权限,则再次执行MainActivity调用,否则只需在拒绝权限时执行所需的操作,例如向他说明需要权限的原因,然后再试一次或退出。

希望能帮上忙。对于简化版本中有关android权限的所有内容,只需单击在这里(http://www.vogella.com/tutorials/AndroidPermissions/article.html)即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42118639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档