【问题标题】:Start the Activity After Multiple Permission?android 6+多权限后启动Activity?android 6+
【发布时间】:2017-03-09 04:34:06
【问题描述】:

我已在初始屏幕上将此授予 Req Multiple 权限

public class Main_MulPer extends Activity {

public static final int R_PERM = 321;

Context context = this;

public static boolean hasPermissions(Context context, String... permissions) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rcssa);


    int PERMISSION_ALL = 1;
    String[] PERMISSIONS = {Manifest.permission.CAMERA,
    Manifest.permission.READ_PHONE_STATE,
    Manifest.permission.INTERNET,
    Manifest.permission.ACCESS_NETWORK_STATE,
    Manifest.permission.ACCESS_WIFI_STATE,
    Manifest.permission.NFC,
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE,     
    };

    if (!hasPermissions(this, PERMISSIONS)) {
        ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);

        Main_MulPer.this.finish();
        Intent ss = new Intent(Main_MulPer.this, Main_acti.class);
        ss.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        ss.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ss.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        ss.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(ss);

    } else {
        if (!hasPermissions(this, PERMISSIONS)) ;
        {
            ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Main_MulPer.this.finish();
                    Intent i = new Intent(Main_MulPer.this, Splash_two.class);
                    startActivity(i);
                }
            }, 3000);

        }
    }

}

}

所以这里我的问题是它一次要求两个权限......

如果我尝试允许他们转移到另一个活动...所以我已经给出了类似的 3 个活动,每个活动有 2 个权限..

但是由于 Handler 开启了新的活动.. 然后我删除了延迟处理程序......现在它打开了最后一个活动......直接......

任何人都可以建议我如何在所有权限后启动主要活动... 未经许可它应该退出应用程序...请帮助我

更新

Insted of Multiple permissions 我已经拆分了 3 个活动,每个活动有两个权限...但是在这里它应该在获得权限后转到下一个活动但是每次前两个活动权限缺失时它都会转到最后一个活动 所以我需要退出应用程序并给他们...

我只需要未经许可不要移动到下一个屏幕

任何人都可以在获得许可后建议我只进行下一个活动....

【问题讨论】:

  • 这是一个非常糟糕的方法,你应该只在用户非常清楚你为什么需要它们时才请求权限(即他们点击相机,它要求相机许可),做不建议其他任何事情。此外,正如事后的想法,您永远不应该仅仅因为未授予权限而批量请求权限,因为拒绝先前授予的权限将自动终止相关应用程序
  • 但是我的应用程序是商业的,所以我一次性全部提供了......因为一旦用户登录它就会运行几乎 24 小时......所以每次询问都是非常负担......如果我每次都给它一个不好的方法....
  • 商业与否无关紧要,与它完全无关。它不会每次都询问,我非常建议您正确阅读有关权限的文档,因为它不会每次都询问用户,除非他们还没有授予权限
  • “如果我每次都给它一个不好的方法”..完全不同意这一点..运行时权限背后的想法是让用户有资格安装,而无需在安装时授予所有权限。只有当用户需要特定功能时,我们才需要请求许可。实际上,您应该每次都询问(意味着检查用户是否有权访问某项功能)。如果您不检查该权限并且用户手动禁用了权限,您的应用将在 6.0+ 中崩溃。
  • 在我的活动中,我有很多事情要请求权限...我不知道哪个先...所以我给出了这样的,,,如果可能的话以这种方式回答...我不选择其他方式,.,,因为这个应用程序在 android 5 中运行良好,但由于运行时权限它不工作所以客户端不接受它......

标签: android runtime-permissions


【解决方案1】:

试试这个,

 public class Main_nPRC extends Activity {

public static final String MainPP_SP = "MainPP_data";
public static final int R_PERM = 2822;
private static final int REQUEST= 112;

Context mContext = this;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rcssa);

    SharedPreferences settings = getSharedPreferences(MainPP_SP, 0);
    HashMap<String, String> map = (HashMap<String, String>) settings.getAll();

    if (Build.VERSION.SDK_INT >= 23) {
        Log.d("TAG","@@@ IN IF Build.VERSION.SDK_INT >= 23");
        String[] PERMISSIONS = {android.Manifest.permission.CAMERA,
                android.Manifest.permission.READ_PHONE_STATE,
                android.Manifest.permission.INTERNET,
                android.Manifest.permission.ACCESS_NETWORK_STATE,
                android.Manifest.permission.ACCESS_WIFI_STATE,
                android. Manifest.permission.NFC,
                android.Manifest.permission.READ_EXTERNAL_STORAGE,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
        };


        if (!hasPermissions(mContext, PERMISSIONS)) {
            Log.d("TAG","@@@ IN IF hasPermissions");
            ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST );
        } else {
            Log.d("TAG","@@@ IN ELSE hasPermissions");
            callNextActivity();
        }
    } else {
        Log.d("TAG","@@@ IN ELSE  Build.VERSION.SDK_INT >= 23");
        callNextActivity();
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("TAG","@@@ PERMISSIONS grant");
                callNextActivity();
            } else {
                Log.d("TAG","@@@ PERMISSIONS Denied");
                Toast.makeText(mContext, "PERMISSIONS Denied", Toast.LENGTH_LONG).show();
            }
        }
    }
}

private static boolean hasPermissions(Context context, String... permissions) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

public void callNextActivity()
{
    Intent ss = new Intent(Main_nPRC.this, NMainSS.class);
    ss.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    ss.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    ss.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    ss.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    startActivity(ss);
    finish();
}



@Override
public void onBackPressed() {

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setTitle("ⓘ Exit ! " + getString(R.string.app_name));
    alertDialogBuilder
            .setMessage(Html.fromHtml("<p style='text-align:center;'>Please Fill the required details</p><h3 style='text-align:center;'>Click Yes to Exit !</h4>"))
            .setCancelable(false)
            .setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            moveTaskToBack(true);
                            android.os.Process.killProcess(android.os.Process.myPid());
                            System.exit(0);

                        }
                    })

            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                    dialog.cancel();
                }
            });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();

}

}

【讨论】:

  • @MLN 在 onRequestPermissionsResult 中调用下一个活动意图
  • 谢谢@user2025187 但是这里它没有等待它在没有权限的情况下移动到下一个活动我想要停止他你能建议我在没有许可的情况下不要移动到下一个活动......你的答案似乎很好,但我的问题仍然存在一样
  • 我已经更新了你的例子,所有没有新的代码,只是用你的代码替换了我的整个代码,,,但是它仍然移动到下一个活动......没有给予所有权限......甚至一个还允许,我看到它在移动,但是当我尝试将它的移动触摸到下一个活动时,不会呆在那里......
  • 发布您更新的代码,以便帮助我解决您的问题
【解决方案2】:
final int PERMISSION_REQUEST_CODE = 111;

if (Build.VERSION.SDK_INT >= 23) {
      if (!checkReadContactPermission() ||!checkReadPhoneStatePermission()
          || !checkWriteExternalStorage() || !checkReadExternalStorage() ||
          !checkSystemAlertWindowPermission() || !checkWriteContactPermission()) {
                   requestPermission();
            } else {
                  // Move to main act
          }
      } else {
                  // Move to main act
   }

你必须为每个人制定检查权限的方法

例如。这是用于 READ CONTACT,以同样的方式添加所有其他

private boolean checkReadContactPermission() {
            int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CONTACTS);
            if (result == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        }

请求权限的方法

private void requestPermission() {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS,
                            Manifest.permission.WRITE_CONTACTS,
                            Manifest.permission.READ_PHONE_STATE,
                           /* Manifest.permission.CAMERA,*/
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_CODE);
        }

最后是 RequestPermissionResult

   @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                // if granted then 0 else -1
                // i have 5 permisson to check so 0,1,2,3,4..
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[1] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[2] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[3] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[4] == PackageManager.PERMISSION_GRANTED) {

                    // means all permission are granted..move to Main activity

                } else {
                   // show alert
                }
                break;
        }
    }

【讨论】:

    【解决方案3】:

    当您请求许可时,您将在 onRequestPermissionsResult 中收到结果,如 google 文档所说的那样处理来自内部的结果 here

    更新

    你提到的权限是分组的例子

    Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE

    它只会要求一个权限,一个是通话(读取电话状态),您不需要请求访问网络状态和互联网的权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多