2017-02-12 71 views
1

我需要将新的权限添加到一个旧项目中,该项目仍然需要坚持建设。下面是以前的配置:Android 6.0权限和目标

project.properties:
target=android-23

的AndroidManifest.xml:
<uses-sdk android:minSdkVersion="13" />

我改变AndroidManifest.xml中以
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="23" />
却发现在我的Android 6.0手机,它仍然警告我,我的应用程序不符合最新的Android权限要求。它的行为就好像它真的是23岁以前的目标。

那么有没有解决方案?

+1

您有2个选项:1-降低目标API,使用22或更低。 2-按照本教程实现新的权限系统https://developer.android.com/training/permissions/requesting.html – MatPag

+0

@MatPag我已经在代码中实现了新的权限系统,并将目标设置为23,但它仍然行为正常像它瞄准较低。 – user1377046

回答

0

我只是分享代码来添加检查权限,这是自Marshnmallow以来一直采用的强制过程。例如,我检查是否有权访问摄像头。

private void launchCamera() { 

    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(MyActivity.this, 
       Manifest.permission.CAMERA)) { 
      // Showing explanation to user to require permission 

      // <Build a dialog here. Following shows how to handle dialog clicks> 

      dialog.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        // Yes, user wants to give permission 
        dialog.dismiss(); 
        ActivityCompat.requestPermissions(MyActivity.this, 
          new String[] {Manifest.permission.CAMERA}, 
          Constants.PERMISSION_CAMERA); 
       } 
      }); 
      alog.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        // No, user does not want to give permission now 
        dialog.dismiss(); 
       } 
      }); 

     } else { 
      // No explanation needed, requesting for permission now. 
      ActivityCompat.requestPermissions(this, 
        new String[] {Manifest.permission.CAMERA}, 
        Constants.PERMISSION_CAMERA); 
     } 

    } else { 
     // Permission to get location has been granted already. 
     try { 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(intent, Constants.CAMERA_CAPTURE_REQUEST); 
     } catch (ActivityNotFoundException e) { 
      e.printStackTrace(); 
      Log.e(TAG, "Camera is not found!"); 
     } 

    } 
} 

下一步,我们必须根据所提供的系统对话框(这只是我们的对话框弹出后)用户的响应来实现的方法。

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

    if (requestCode == Constants.PERMISSION_CAMERA){ 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      launchCamera(); 

     } else if (grantResults[0] == PackageManager.PERMISSION_DENIED){ 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.CAMERA)) { 

       /*Here we have to show a dialog/ something else to show user why app requires permission. This is a good practice.*/ 

       // Handle dialog clicks again 
       // Build a dialog here 
       btnPositiveOfDialog.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         // Yes, I want to give permission now after reading detailed message 
         dialog.dismiss(); 
         ActivityCompat.requestPermissions(UserInfoActivity.this, 
           new String[] {Manifest.permission.CAMERA}, 
           Constants.PERMISSION_CAMERA); 
        } 
       }); 
       btnNegativeOfDialog.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         // No, I still don't understand detailed message and want give permission away 
         dialog.dismiss(); 
        } 
       }); 

      } else { 
       // User checked 'Never ask again' 
       // Build a dialog here 
       btnPositiveOfDialog.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         // Yes, go to app settings and manually enable settings 
         dialog.dismiss(); 
         final Intent i = new Intent(); 
         i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
         i.addCategory(Intent.CATEGORY_DEFAULT); 
         i.setData(Uri.parse("package:" + UserInfoActivity.this.getPackageName())); 
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
         i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
         MyActivity.this.startActivity(i); 
        } 
       }); 
       btnNegativeOfDialog.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         // No, I don't want to go to user settings and give permission now. 
         dialog.dismiss(); 
        } 
       }); 
       dialog.show(); 

      } 

     } 
    } 
}