2016-11-07 3 views
0

Uses-Berechtigungen für ManifestKamera-Intent-Erlaubnis, Android, warum das nicht funktioniert?

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

und

CODE

mCameraButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (ActivityCompat.checkSelfPermission(getActivity(), 
        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
       requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1000); 
      } else { 
       startCameraActivity(); 
      } 
     } 
    }); 

public void startCameraActivity() { 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) { 
     startActivityForResult(cameraIntent, 1000); 
    } 
} 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == 1000) { 
      first_getUri = data.getData(); 
      Bitmap bitmap = null; 
      try { 
       bitmap = getBitmapFromUri(first_getUri); 
      } catch (IOException e) { 
      } 

      File imageFile = null; 
      try { 
       imageFile = createFileFromBitmap(bitmap); 
      } catch (IOException e) { 
      } 
      returnUri = Uri.fromFile(imageFile); 
     } 

     Glide.with(this) 
       .load(returnUri) 
       .override(1280, 1280) 
       .into(mImageview); 
    } 
} 

Und das ist für andere Methoden (können Sie ignorieren)

private Bitmap getBitmapFromUri(Uri uri) throws IOException { 
    ParcelFileDescriptor parcelFileDescriptor = 
      getActivity().getContentResolver().openFileDescriptor(uri, "r"); 
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 

    BitmapFactory.Options opts = new BitmapFactory.Options(); 
    opts.inJustDecodeBounds = true; 
    BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts); 

    int width = opts.outWidth; 
    int height = opts.outHeight; 

    float sampleRatio = getSampleRatio(width, height); 

    opts.inJustDecodeBounds = false; 
    opts.inSampleSize = (int) sampleRatio; 

    Bitmap resizedBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts); 
    Log.d("Resizing", "Resized Width/Height : " + resizedBitmap.getWidth() + "/" + resizedBitmap.getHeight()); 
    parcelFileDescriptor.close(); 
    return resizedBitmap; 
} 

private float getSampleRatio(int width, int height) { 

    final int targetWidth = 1280; 
    final int targetheight = 1280; 

    float ratio; 

    if (width > height) { 
     // Landscape 
     if (width > targetWidth) { 
      ratio = (float) width/(float) targetWidth; 
     } else ratio = 1f; 
    } else { 
     // Portrait 
     if (height > targetheight) { 
      ratio = (float) height/(float) targetheight; 
     } else ratio = 1f; 
    } 
    return Math.round(ratio); 
} 

private File createFileFromBitmap(Bitmap bitmap) throws IOException { 
    File newFile = new File(getActivity().getFilesDir(), makeImageFileName()); 
    FileOutputStream fileOutputStream = new FileOutputStream(newFile); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); 
    fileOutputStream.close(); 
    return newFile; 
} 

private String makeImageFileName() { 

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_hhmmss"); 
    Date date = new Date(); 
    String strDate = simpleDateFormat.format(date); 
    return strDate + ".png"; 
} 

Die CODE gut funktioniert, wenn CODE für get Bild aus der Galerie ist wie diese

private void startGallery() { 
    Intent cameraIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    cameraIntent.setType("image/*"); 
    if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) { 
     startActivityForResult(cameraIntent, 2000); 
    } 
} 

Also, ich denke, dass Problem in Android-Berechtigung ist.

CODE funktioniert gut unter oder gleich android 5.xx

Aber funktioniert nicht auf über oder gleich android 6.xx

Frage: Gibt es eine Erlaubnis Code fehlgeschlagen ich verpasst?

Android Permission ist zu schwer zu verstehen Würden Sie mich wissen lassen, wie Sie diesen CODE ändern?

bearbeiten

keine Mittel arbeiten: wenn ich mCameraButton klicken, nichts passieren. Es ist nichts passiert.

+2

Bitte erläutern, ** im Detail **, was "Sie funktioniert nicht" bedeutet. Außerdem gibt "ACTION_IMAGE_CAPTURE" keinen "Uri" zurück. – CommonsWare

+1

Sie müssen 'Runtime Permission' für Android 6.0 und höher hinzufügen. –

+0

@CommonsWare ich hinzugefügt. "Funktioniert nicht" bedeutet, dass nichts passiert ist. –

Antwort

2

Also, ich denke, Problem ist in Android-Erlaubnis.

CODE funktioniert gut unter oder gleich android 5.xx

Aber tun funktioniert nicht auf über oder gleich android 6.xx

Dazu müssen Sie Runtime Erlaubnis für Android 6.0 und höher hinzufügen.

Beispiel.

final private int REQUEST_CODE_ASK_PERMISSIONS_CAMERA = 100; 
final private int REQUEST_CODE_ASK_PERMISSIONS_EXTERNAL_STORAGE = 200; 

// For Check Camera Permission 
if (Build.VERSION.SDK_INT >= 23) { 
      int hasPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA); 
      if (hasPermission != PackageManager.PERMISSION_GRANTED) { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { 
        // Display UI and wait for user interaction 
        getErrorDialog("You need to allow Camera permission." + 
          "\nIf you disable this permission, You will not able to add attachment.", getActivity(), true).show(); 
       } else { 
        requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_PERMISSIONS_CAMERA); 
       } 
       return; 
      } 
     } 

// For Check Read External Permission. 
if (Build.VERSION.SDK_INT >= 23) { 
      int hasPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE); 
      if (hasPermission != PackageManager.PERMISSION_GRANTED) { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) { 
        // Display UI and wait for user interaction 
        getErrorDialog("You need to allow Read External Storage permission." + 
          "\nIf you disable this permission, You will not able to add attachment.", getActivity(), false).show(); 
       } else { 
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS_EXTERNAL_STORAGE); 
       } 
       return; 
      } 
     } 

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_CODE_ASK_PERMISSIONS_CAMERA: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission Granted 
        Toast.makeText(getActivity(), "Permission Grant", Toast.LENGTH_SHORT).show(); 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
        String imageFileName = "JPEG_" + timeStamp + ".jpg"; 
        File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), imageFileName); 
        uri = Uri.fromFile(imageStorageDir); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
        startActivityForResult(intent, 1); 

       } else { 
        // Permission Denied 
        Toast.makeText(getActivity(), "Required permission is disable.", Toast.LENGTH_SHORT).show(); 
       } 
       break; 

      case REQUEST_CODE_ASK_PERMISSIONS_EXTERNAL_STORAGE: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission Granted 
        Toast.makeText(getActivity(), "Permission Grant", Toast.LENGTH_SHORT).show(); 
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        intent.setType("image/*"); 
        startActivityForResult(intent, 2); 

       } else { 
        // Permission Denied 
        Toast.makeText(getActivity(), "Required permission is disable.", Toast.LENGTH_SHORT).show(); 
       } 
       break; 

      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

public AlertDialog.Builder getErrorDialog(String message, Context context, final boolean isFromCamera) { 
     final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); 
     alertDialog.setTitle(getString(R.string.app_name)).setMessage(message); 
     alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       dialog.dismiss(); 
       if (Build.VERSION.SDK_INT >= 23) { 
        if(isFromCamera){ 
         requestPermissions(new String[]{Manifest.permission.CAMERA}, 
           REQUEST_CODE_ASK_PERMISSIONS_CAMERA); 
        }else { 
         requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
           REQUEST_CODE_ASK_PERMISSIONS_EXTERNAL_STORAGE); 
        } 
       } 

      } 
     }); 
     return alertDialog; 
    } 
+0

Danke für die freundliche Antwort Chirag Savsani –

+0

Willkommen Bruder. –

1

ab Android Marshmellow das Android-Ökosystem erfordert Entwickler gewisse Berechtigung zur Laufzeit zu erwerben, das heißt, sie explizit den Benutzer für die Berechtigung erteilt werden fragen. Sie können mehr lesen here.

Aber ich verstehe, dass das Anfordern dieser Berechtigungen eine Menge Standardcode erfordert, der schnell entmutigend geschrieben wird. Daher schlage ich vor, dass Sie eine Drittanbieter-Bibliothek verwenden. Ein Favorit von mir ist Let. Let reduziert den für die Verwendung von Laufzeitberechtigungen erforderlichen Textbaustein erheblich.

+0

Danke für Ihre Antwort Hamed Momeni –

1

Anfordern Laufzeitberechtigung ist leicht zu verstehen. Bitte werfen Sie einen Blick auf Android offizielle Requests Permissions zur Laufzeit.

Check it out here

+0

Danke für Ihre Antwort Akshay Soni –