2017-11-21 27 views
0

アンドロイドの新しいバージョンで動作するようAndroidアプリを取得しようとしていて、「実行時に権限を要求しています」というGoogleの開発者レッスンに従っていますが、私がカメラを開こうとすると、アプリケーションがクラッシュします。私はここで間違っていることを理解していない。 は、ここに私のコードでは、関連するメソッドです:リクエスト実行時のアクセス許可を取得できません

private void showPictureDialog() { 
    AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this); 
    pictureDialog.setTitle("Select Action"); 
    String[] pictureDialogItems = { 
      "Select photo from gallery", 
      "Capture photo from camera"}; 
    pictureDialog.setItems(pictureDialogItems, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        switch (which) { 
         case 0: 
          choosePhotoFromGallary(); 
          break; 
         case 1: 
          checkPermissionsR(); 

          break; 
        } 
       } 
      }); 
    pictureDialog.show(); 
} 
public void checkPermissionsR() { 

     if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 
      takePhotoFromCamera(); 
     } else { 
      if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       Toast.makeText(this, "need external storage permission", Toast.LENGTH_SHORT).show(); 
      } 
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); 
     } 

} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == REQUEST_PERMISSIONS) { 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      takePhotoFromCamera(); 
     } else 
      Toast.makeText(this, "permission was not granted to save images", Toast.LENGTH_SHORT).show(); 
    } else { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

はまた、私はこの問題はここにあるとは思わないが、私はそれがあまりに場合には、このセクションが含まれます。

private void takePhotoFromCamera() { 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, CAMERA); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == this.RESULT_CANCELED) { 
     return; 
    } 
    if (requestCode == GALLERY) { 
     if (data != null) { 
      Uri contentURI = data.getData(); 
      try { 
       Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI); 
       String path = saveImage(bitmap); 
       Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show(); 


      } catch (IOException e) { 
       e.printStackTrace(); 
       Toast.makeText(MainActivity.this, "Failed!", Toast.LENGTH_SHORT).show(); 
      } 
     } 

    } else if (requestCode == CAMERA) { 
     Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     saveImage(thumbnail); 
     Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show(); 
    } 

    RecyclerView.Adapter newImageAdapter = new ImageAdapter(BingoGalleryFolder); //***************// 
    recycleView.swapAdapter(newImageAdapter,false); 
} 

public String saveImage(Bitmap myBitmap) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes); 
    File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY); 
    // have the object build the directory structure, if needed. 
    if (!wallpaperDirectory.exists()) { 
     wallpaperDirectory.mkdirs(); 
    } 

    try { 
     File f = new File(wallpaperDirectory, Calendar.getInstance() 
       .getTimeInMillis() + ".jpg"); 
     f.createNewFile(); 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     MediaScannerConnection.scanFile(this, 
       new String[]{f.getPath()}, 
       new String[]{"image/jpeg"}, null); 
     fo.close(); 
     Log.d("TAG", "File Saved::--->" + f.getAbsolutePath()); 

     return f.getAbsolutePath(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    return ""; 

} 
+0

logcat出力を投稿すると助けになります。 –

+0

ok、私は秒でそうする – AJM

答えて

4

は、アプリケーションの起動時に一度にすべての権限を要求してみます。あなたのMainActivity

で 枚このごonCreateメソッド呼び出しの最初:

checkPermissions(); 

そして、これらのメソッドを呼び出すしてみてください:

private void checkPermissions() { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (!checkAllPermission()) 
       requestPermission(); 
     } 
    } 

private void requestPermission() { 
     ActivityCompat.requestPermissions(MainActivity.this, new String[] 
       { 
         CAMERA, 
         READ_EXTERNAL_STORAGE, 
         WRITE_EXTERNAL_STORAGE, 
         //check more permissions if you want 
        ........ 


       }, RequestPermissionCode); 
    } 
@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case RequestPermissionCode: 
       if (grantResults.length > 0) { 

        boolean CameraPermission = grantResults[0] == PackageManager.PERMISSION_GRANTED; 
        boolean ReadExternalStatePermission = grantResults[1] == PackageManager.PERMISSION_GRANTED; 
        boolean ReadWriteStatePermission = grantResults[2] == PackageManager.PERMISSION_GRANTED; 
        // 
        ....... 


        if (CameraPermission && ReadExternalStatePermission && ReadWriteStatePermission) { 

         Toast.makeText(MainActivity.this, "Permissions acquired", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(MainActivity.this, "One or more permissions denied", Toast.LENGTH_LONG).show(); 

        } 
       } 

       break; 
      default: 
       break; 
     } 
    } 

    public boolean checkAllPermission() { 

     int FirstPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA); 
     int SecondPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE); 
     int ThirdPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE); 
     ..... 


     return FirstPermissionResult == PackageManager.PERMISSION_GRANTED && 
       SecondPermissionResult == PackageManager.PERMISSION_GRANTED && 
       ThirdPermissionResult == PackageManager.PERMISSION_GRANTED 
       } 
+0

私はこれを試してみたいが、私はrequestPermissionのRequestPermissionCodeの "シンボルを解決できない"というメッセージが表示されている。私はそれのために何かをインポートするオプションを取得していないよ、私は変数を初期化する必要がありますか? – AJM

+0

はい、グローバルに定義する必要があります。 など。 'public static final int RequestPermissionCode = 1;' – An08NY

-1

MANIFESTファイルへのアクセス許可を追加してください。

<uses-permission android:name="android.permission.CAMERA" /> 

とあなたのcheckPermissionsRで

は()私は、これはあなたを助けることを願っています。この権限

ContextCompat.checkSelfPermission(this, Manifest.permission.Camera) 
1

を取得し、それは私のプロジェクトで正常に動作します。あなたのケース1では

public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123; 
     public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 124; 
     public static final int MY_PERMISSIONS_REQUEST_CAMERA = 124; 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     public static boolean checkPermissionread(final Context context) { 
      int currentAPIVersion = Build.VERSION.SDK_INT; 
      if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
       if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) { 
         AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
         alertBuilder.setCancelable(true); 
         alertBuilder.setTitle("Permission necessary"); 
         alertBuilder.setMessage("External storage permission is necessary"); 
         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_READ_EXTERNAL_STORAGE); 
          } 
         }); 
         AlertDialog alert = alertBuilder.create(); 
         alert.show(); 
        } else { 
         ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
        } 
        return false; 
       } else { 
        return true; 
       } 
      } else { 
       return true; 
      } 
     } 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     public static boolean checkPermissionwrite(final Context context) { 
      int currentAPIVersion = Build.VERSION.SDK_INT; 
      if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
       if (ContextCompat.checkSelfPermission(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("Permission necessary"); 
         alertBuilder.setMessage("External storage permission is necessary"); 
         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.CAMERA}, 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; 
      } 
     } 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     public static boolean checkPermissioncamera(final Context context) { 
      int currentAPIVersion = Build.VERSION.SDK_INT; 
      if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
       if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
         AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
         alertBuilder.setCancelable(true); 
         alertBuilder.setTitle("Permission necessary"); 
         alertBuilder.setMessage("External storage permission is necessary"); 
         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.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); 
          } 
         }); 
         AlertDialog alert = alertBuilder.create(); 
         alert.show(); 
        } else { 
         ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); 
        } 
        return false; 
       } else { 
        return true; 
       } 
      } else { 
       return true; 
      } 
     } 
     protected ProgressDialog mProgressDialog; 
     protected void showProgressDialog(String title,String message) 
     { 
      /* if(mProgressDialog!=null) 
      { 
       mProgressDialog.dismiss(); 
      }*/ 
      mProgressDialog = ProgressDialog.show(this,title,message); 
     } 
1

、あなたが外部ストレージを書くことについて許可を取っている、あなたはSOまず、このようなあなたのマニフェストに許可を述べ、カメラの使用について許可を取る必要があります。

<uses-permission android:name="android.permission.CAMERA" /> 

とあなたのcheckPermissionsR(中)この権限

ContextCompat.checkSelfPermission(this, Manifest.permission.Camera) 
0

はこの1

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       //Show Information about why you need the permission 
       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
       builder.setTitle("Need Storage Permission"); 
       builder.setMessage("This app needs storage permission."); 
       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
       builder.show(); 
      } else if (permissionStatus.getBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,false)) { 
       //Previously Permission Request was cancelled with 'Dont Ask Again', 
       // Redirect to Settings after showing Information about why you need the permission 
       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
       builder.setTitle("Need Storage Permission"); 
       builder.setMessage("This app needs storage permission."); 
       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         sentToSettings = true; 
         Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
         Uri uri = Uri.fromParts("package", getPackageName(), null); 
         intent.setData(uri); 
         startActivityForResult(intent, REQUEST_PERMISSION_SETTING); 
         Toast.makeText(getBaseContext(), "Go to Permissions to Grant Storage", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
       builder.show(); 
      } else { 
       //just request the permission 
       ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT); 
      } 

      SharedPreferences.Editor editor = permissionStatus.edit(); 
      editor.putBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,true); 
      editor.commit(); 


     } else { 
      //You already have the permission, just go ahead. 
      proceedAfterPermission(); 
     } 
をお試しください
関連する問題