1

我在eclipse IDE中编写图形程序并编译23 api版本,minSdkVersion =“11”,这对我保持targetSdkVersion =“16”很重要。 我必须在我的一个活动(DarjActivity)中使用设备相机。所有的东西都可以,但是因为我试图改进我的代码来支持android marshmallow(api 23)的权限,所以添加了Check_Permission类,它导致了一些错误。请指导我那个令人困惑的问题! 感谢与问候。Android Marshmallow检查权限

DarjActivity类:

private void selectImage() { 
    final CharSequence[] items = { "camera", "gallery", 
     "cancel" }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(DarjActivity.this); 
    builder.setTitle("capture photo"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int item) { 
     boolean result=Check_Permission.checkPermission(DarjActivity.this); 

     if (items[item].equals("camera")) { 
     // userChoosenTask="Take Photo"; 
      if(result); 
       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, 1); 

     } else if (items[item].equals("gallery")) { 
     // userChoosenTask="Choose from Library"; 
      if(result); 

      Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT);// 
     startActivityForResult(Intent.createChooser(intent, "select"),2); 

     } else if (items[item].equals("cancel")) { 
      dialog.dismiss(); 
     } 
    }  
    }); 
    builder.show(); 
} 

Check_Permission类:

package com.codegostarNiloo.negar; 

import android.Manifest; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.pm.PackageManager; 
import android.os.Build; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 

public class Check_Permission { 
    public static final int MY_PERMISSIONS_REQUEST_CAMERA = 123; 

    public static boolean checkPermission(final Context context) 
    { 
     int currentAPIVersion = Build.VERSION.SDK_INT; 
     if(Build.VERSION.SDK_INT >= 23) 
//   if(currentAPIVersion>=Build.VERSION_CODES.M) 
     { 
      if (ContextCompat.checkSelfPermission((Activity) context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.CAMERA)) { 
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
        alertBuilder.setCancelable(true); 
        alertBuilder.setTitle("Check Permission"); 
        alertBuilder.setMessage("pleas let this applicathion to use your device camera"); 
        alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
         @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CAMERA); 
         } 
        }); 
        AlertDialog alert = alertBuilder.create(); 
        alert.show(); 

       } else { 
        ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); 
       } 
       return false; 
      } else { 
       return true; 
      } 
     } else { 
      return true; 
     } 
    } 
} 

这里在Check_Permission类中,(checkSelfPermission),(shouldShowRequestPermissionRationale)和(requestPermissions)方法发生错误。 对于它们的第一个参数,我放置(Activity)上下文,上下文上下文,上下文,this.Activity,Activity.this,DarjActivity和ext。我更新并取代了bin文件夹中的一些android-support-v4.jar文件。

AndroidManifest权限:

<uses-feature android:name="android.hardware.camera"></uses-feature> 
<uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="ANDROID.PERMISSION.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="16" /> 
+0

忽略代码中的任何错误,如果拒绝将'targetSdkVersion'向上移动,则会浪费工作。运行时权限仅适用于API 23及更高版本。为什么你不能改变你的目标版本? –

+0

发生了什么样的错误?请更具体地为 – 0X0nosugar

+0

@ 0X0nosugar(error): 未定义类型为ContextCompat的方法checkSelfPermission(Activity,String) 对于类型ActivityCompat,未定义方法shouldShowRequestPermissionRationale(Activity,String) –

回答

0

步骤1.

首先实现ActivityCompat.OnRequestPermissionsResultCallback您的活动

private static final int REQUEST_CAMERA_PERMISSION = 1; 
    private static final String FRAGMENT_DIALOG = "dialog"; 

步骤2重写方法

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull   String[] permissions, @NonNull int[] grantResults) 
{ 
    switch (requestCode) 
    { 
     case REQUEST_CAMERA_PERMISSION: 
      if (permissions.length != 1 || grantResults.length != 1) { 
       throw new RuntimeException("Error on requesting camera permission."); 
      } 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.camera_permission_not_granted, 
         Toast.LENGTH_SHORT).show(); 
      } 
      // No need to start camera here; it is handled by onResume 
      break; 
    } 
} 


@Override 
protected void onResume() 
{ 
    super.onResume(); 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) 
      == PackageManager.PERMISSION_GRANTED) { 

     // Do whatever you want to do after the permission granted. 


    } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.CAMERA)) { 
     ConfirmationDialogFragment 
       .newInstance(R.string.camera_permission_confirmation, 
         new String[]{Manifest.permission.CAMERA}, 
         REQUEST_CAMERA_PERMISSION, 
         R.string.camera_permission_not_granted) 
       .show(getSupportFragmentManager(), FRAGMENT_DIALOG); 
    } else { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 
       REQUEST_CAMERA_PERMISSION); 
    } 



} 

第3步写对话片段,要求许可 - 公共静态类ConfirmationDialogFragment扩展DialogFragment {

private static final String ARG_MESSAGE = "message"; 
    private static final String ARG_PERMISSIONS = "permissions"; 
    private static final String ARG_REQUEST_CODE = "request_code"; 
    private static final String ARG_NOT_GRANTED_MESSAGE = "not_granted_message"; 

    public static ConfirmationDialogFragment newInstance(@StringRes int message, 
                 String[] permissions, int requestCode, @StringRes int notGrantedMessage) { 
     ConfirmationDialogFragment fragment = new ConfirmationDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_MESSAGE, message); 
     args.putStringArray(ARG_PERMISSIONS, permissions); 
     args.putInt(ARG_REQUEST_CODE, requestCode); 
     args.putInt(ARG_NOT_GRANTED_MESSAGE, notGrantedMessage); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Bundle args = getArguments(); 
     return new AlertDialog.Builder(getActivity()) 
       .setMessage(args.getInt(ARG_MESSAGE)) 
       .setPositiveButton(android.R.string.ok, 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           String[] permissions = args.getStringArray(ARG_PERMISSIONS); 
           if (permissions == null) 
           { 
            throw new IllegalArgumentException(); 
           } 
           ActivityCompat.requestPermissions(getActivity(), 
             permissions, args.getInt(ARG_REQUEST_CODE)); 
          } 
         }) 
       .setNegativeButton(android.R.string.cancel, 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           Toast.makeText(getActivity(), 
             args.getInt(ARG_NOT_GRANTED_MESSAGE), 
             Toast.LENGTH_SHORT).show(); 
          } 
         }) 
       .create(); 
    } 

} 

第4步总是对的onResume()检查相机许可

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) 
      == PackageManager.PERMISSION_GRANTED) 
    { 
     // Do whatever you want to do if permission granted 
    } 
    else if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.CAMERA)) { 
     ConfirmationDialogFragment 
       .newInstance(R.string.camera_permission_confirmation, 
         new String[]{Manifest.permission.CAMERA}, 
         REQUEST_CAMERA_PERMISSION, 
         R.string.camera_permission_not_granted) 
       .show(getSupportFragmentManager(), FRAGMENT_DIALOG); 
     } else { 
     ActivityCompat.requestPermissions(this, new String[]   { Manifest.permission.CAMERA}, 
        REQUEST_CAMERA_PERMISSION); 
    } 

希望它可以帮助!

+0

感谢您的帮助。但是,我无法在DarjActivity中实现ActivityCompat.OnRequestPermissionsResultCallback,因为在eclipse中发生错误(ActivityCompat无法解析为某种类型),并且可以快速修复:创建接口ActivityCompat。要实现这一点,它的进口,请?? 2 - 我的DarjActivity有第一步和第二步,或者我必须创建一个新的类? –