1

Eclipse IDEでグラフィカルプログラムを作成していて、23のAPIバージョン、minSdkVersion = "11"でコンパイルしています。これはtargetSdkVersion = "16"を維持するために重要です。 自分の活動(DarjActivity)の1つでデバイスカメラを使用する必要があります。すべて正常に動作しますが、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)メソッドでエラーが発生します。 それらの最初のパラメータとして、(アクティビティ)コンテキスト、コンテキストコンテキスト、コンテキスト、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(エラー)@ – 0X0nosugar

+0

より具体的にしてください: 方法checkSelfPermission(活動、String)をタイプに定義されていませんContextCompat は方法shouldShowRequestPermissionRationale(活動、String)をTanis.7x @タイプActivityCompat –

答えて

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許可を尋ねるダイアログフラグメントを書く - のpublic staticクラスConfirmationDialogFragmentは

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); 
    } 

はそれが役に立てば幸い常に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()をチェック拡張します!!

+0

あなたの助けていただきありがとうございます。しかし、私はDarjActivityにActivityCompat.OnRequestPermissionsResultCallbackを実装できません。なぜなら、Eclipseでエラーが発生するからです(ActivityCompatはタイプに解決できません)。それを実装するにはどうすればいいですか?2 - DarjActivityの最初のステップと2番目のステップがあるのですか、新しいクラスを作成する必要がありますか? –

0

それともPermissionsDispatcherまたはDexterまたはEasyPermissionsまたは多くの多くのothersのような簡単なライブラリを使用します。なぜ、あなたのコードをパーミッション処理で汚染する必要がありますか?

+0

とは何ですか? –

関連する問題