65.9K
CodeProject 正在变化。 阅读更多。
Home

管理 Android Marshmallow 6 上的应用权限

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2016年1月7日

CPOL

3分钟阅读

viewsIcon

17818

介绍新的 Android 权限 Android 6。

引言

在 Google I/O 大会的最后,Google 发布了其新版本的 Android,名为 Marshmallow。 Google 引入了一些新功能。 其中最大的新功能之一是管理从 Play 商店下载的应用程序所获得的权限。

权限

使用 Marshmallow,我们不再需要在安装期间验证权限,而是在使用应用程序时。 用户将可以在使用时选择权限。

我们现在可以从专门用于管理已安装应用程序的权限的菜单中显示应用程序请求的权限。

根据应用程序的不同,您可以启用或禁用对摄像头、位置、麦克风、联系人、短信、移动或 SD 卡存储等的访问权限……

当拒绝权限授权时,我们将无法正确使用与此权限相关的所有功能。 在本文中,我介绍了如何在 Android Marshmallow 上使用权限。

声明权限

第一步是在清单文件中声明应用程序的权限,就像我们通常做的那样。 我们将以访问联系人为例。

<uses-permission-sdk-m android:name="android.permission.READ_CONTACTS" />
<uses-permission-sdk-m android:name="android.permission.WRITE_CONTACTS" />

检查权限

我介绍了通常要使用的方法

  • “checkSelfPermission”方法允许检查对需要权限的功能的访问授权,并且每次我们需要使用它时都会进行检查。

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.WRITE_CALENDAR);

“ContextCompat”允许您独立于 Android 版本使用上下文。 调用此方法的结果是授权 (Granted) 或拒绝 (Denied)。

  • “shouldShowRequestPermissionRationale”方法用于验证用户是否已检查过权限,以避免再次检查授权。

  • “requestPermissions”方法用于向用户请求权限,等待确认。

创建 PermissionUtil 类

在 PermiisionUtil 类中,我们定义了与权限验证相关的方法。

在这个类中,使用了两种方法

  • 第一种方法“VerifyPermissions”检查您要授予应用程序的不同权限。 如果应用程序已获得这些权限的批准,则该方法返回 TRUE。 否则,它返回 FALSE。

  • 第二种方法“requestContactsPermissions”将请求访问联系人(如读取和编写新联系人)的权限。

这是 PermissionUtil 类的实现

public abstract class PermissionUtil {

   public static boolean verifyPermissions(int[] grantResults) {
       // At least one result must be checked.
       if(grantResults.length < 1){
           return false;
       }

       // Verify that each required permission has been granted, otherwise return false.
       for (int result : grantResults) {
           if (result != PackageManager.PERMISSION_GRANTED) {
               return false;
           }
       }
       return true;
   }

   public static boolean requestContactsPermissions(Activity activity) {

       boolean requestPermission;

       if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
               Manifest.permission.READ_CONTACTS)
               || ActivityCompat.shouldShowRequestPermissionRationale(activity,
               Manifest.permission.WRITE_CONTACTS)) {

           // Provide an additional rationale to the user if the permission was not granted
           // and the user would benefit from additional context for the use of the permission.
           // For example, if the request has been denied previously.

           requestPermission =  true;
       } else {
           // Contact permissions have not been granted yet. Request them directly.

           requestPermission =  true;
       }
       return requestPermission;
   }

}

然后您必须从 MainActivity 中管理权限,其中声明了以下变量

private static final int REQUEST_CONTACTS = 1;

private static String[] PERMISSIONS_CONTACT = {Manifest.permission.READ_CONTACTS,
       Manifest.permission.WRITE_CONTACTS};

在这里,REQUEST_CONTACTS 用于查看是否允许该权限。
我们在 PERMISSIONS_CONTACT 表中声明了用于访问联系人的不同权限

回调实现

然后,需要在应用程序的活动中实现“OnRequestPermissionsResultCallBack”接口。

MainActivity extends AppCompactActivity implements OnRequestPermissionsResultCallback

此接口实现了 onRequestPermissionsResult 方法。 这是最重要的部分。 当我们通过 requestCode 接收到联系人访问权限请求时,您需要检查您是否已经允许访问应用程序。 在这里我们需要使用 PermissionsUtil 类的 verifyPermissions 方法

如果授予了权限,它将显示消息“Contacts Permissions have been granted”(已授予联系人权限)
否则,要显示的消息将是“Contacts permissions were NOT granted.”(未授予联系人权限)

此方法的代码如下所示

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

   if (requestCode == REQUEST_CONTACTS) {
       Log.i(TAG, "Received response for contact permissions request.");

       // We have requested multiple permissions for contacts, so all of them need to be
       // checked.
       if (PermissionUtil.verifyPermissions(grantResults)) {
           // All required permissions have been granted, display contacts fragment.
           Snackbar.make(mLayout, R.string.permision_available_contacts,
                   Snackbar.LENGTH_LONG)
                   .show();
       } else {
           Log.i(TAG, "Contacts permissions were NOT granted.");
           Snackbar.make(mLayout, R.string.permissions_not_granted,
                   Snackbar.LENGTH_LONG)
                   .show();
       }

   } else {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
   }
}

现在,只有当用户将要访问联系人时才需要应用权限检查。

在此示例中,验证使用 PermissionsUtil 类的 requestContactsPermissions 方法。

boolean requestPermission = PermissionUtil.requestContactsPermissions(this);

请求权限

将会出现一个 SnackBar,提示我们将进行验证权限。 按下“确定”消息,我们将调用 requestPermissions 函数,该函数将显示一个弹出窗口,询问用户是否要授予此权限,或者它将被拒绝。

这是 requetContactsPermissions 方法的完整实现

private void requestContactsPermissions() {

   boolean requestPermission = PermissionUtil.requestContactsPermissions(this);

   if (requestPermission == true){

       Log.i(TAG,
               "Displaying contacts permission rationale to provide additional context.");

       // Display a SnackBar with an explanation and a button to trigger the request.
       Snackbar.make(mLayout, R.string.permission_contacts_rationale,
               Snackbar.LENGTH_INDEFINITE)
               .setAction(R.string.ok, new View.OnClickListener() {
                   @Override
                   public void onClick(View view) {
                       ActivityCompat
                               .requestPermissions(MainActivity.this, PERMISSIONS_CONTACT,
                                       REQUEST_CONTACTS);
                   }
               })
               .show();

   }

   else {

       ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);

   }

}

检查权限

现在,当应用程序需要检查访问联系人的权限时,调用最后一个方法。 在本教程中,我们会在按下“CHECK PERMISSION”(检查权限)按钮时调用此方法。

OnClick 方法的实现

@Override
public void onClick(View v) {
  
   switch (v.getId()) {
       case R.id.button_check_permissions:
           requestContactsPermissions();
           break;

       default:
           break;
   }

}

这是 MainActivity 的完整代码

public class MainActivity extends AppCompatActivity implements
       OnRequestPermissionsResultCallback, OnClickListener{

   public static final String TAG = "PermissionActivity";

   private View mLayout;
   Button mButtonCheckPermission = null;

   private static final int REQUEST_CONTACTS = 1;
   private static String[] PERMISSIONS_CONTACT = {Manifest.permission.READ_CONTACTS,
           Manifest.permission.WRITE_CONTACTS};

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

       initView();
   }

   private void initView() {
       mButtonCheckPermission = (Button) findViewById(R.id.button_check_permissions);
       mButtonCheckPermission.setOnClickListener(this);

       mLayout = findViewById(R.id.sample_main_layout);

   }

   @Override
   public void onClick(View v) {
      
       switch (v.getId()) {
           case R.id.button_check_permissions:
               requestContactsPermissions();
               break;

           default:
               break;
       }

   }

   private void requestContactsPermissions() {

       boolean requestPermission = PermissionUtil.requestContactsPermissions(this);

       if (requestPermission == true){

           Log.i(TAG,
                   "Displaying contacts permission rationale to provide additional context.");

           // Display a SnackBar with an explanation and a button to trigger the request.
           Snackbar.make(mLayout, R.string.permission_contacts_rationale,
                   Snackbar.LENGTH_INDEFINITE)
                   .setAction(R.string.ok, new View.OnClickListener() {
                       @Override
                       public void onClick(View view) {
                           ActivityCompat
                                   .requestPermissions(MainActivity.this, PERMISSIONS_CONTACT,
                                           REQUEST_CONTACTS);
                       }
                   })
                   .show();

       }

       else {

           ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);

       }

   }

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

       if (requestCode == REQUEST_CONTACTS) {
           Log.i(TAG, "Received response for contact permissions request.");

           // We have requested multiple permissions for contacts, so all of them need to be
           // checked.
           if (PermissionUtil.verifyPermissions(grantResults)) {
               // All required permissions have been granted, display contacts fragment.
               Snackbar.make(mLayout, R.string.permision_available_contacts,
                       Snackbar.LENGTH_LONG)
                       .show();
           } else {
               Log.i(TAG, "Contacts permissions were NOT granted.");
               Snackbar.make(mLayout, R.string.permissions_not_granted,
                       Snackbar.LENGTH_LONG)
                       .show();
           }

       } else {
           super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       }
   }
}

结论

在本文中,我试图展示如何在 Android 的新版本中使用权限。 您可以尽情尝试实现您想测试的权限。

源代码可在 github 上获取:https://github.com/adnenhamdouni/android-permission

© . All rights reserved.