마시멜로의 저장 권한 오류


159

Lollipop에서는 다운로드 기능이 앱에서 제대로 작동하지만 Marshmallow로 업그레이드하면 앱이 다운되어 인터넷에서 SD 카드로 다운로드하려고 할 때이 오류가 발생합니다.

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

이 코드 줄에 대해 불평합니다.

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

응용 프로그램 외부의 매니페스트에 권한이 있습니다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

프로젝트를 정리하고 다시 작성했지만 여전히 충돌합니다.


이 그것이 될 수 있습니다 도움을보십시오 : - stackoverflow.com/a/41221852/5488468
Bipin 바르 티

런타임 권한을 쉽게 처리하는 데 도움이되는 라이브러리를 준비했습니다. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

답변:


357

다음을 사용하여 사용자가 외부 저장소에 대한 권한을 부여했는지 확인해야합니다.

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.v(TAG,"Permission is granted");
    //File write logic here
    return true;
}

그렇지 않은 경우 사용자에게 앱에 권한을 부여하도록 요청해야합니다.

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

물론 이것들은 마시맬로 장치 전용이므로 앱이 마시멜로에서 실행되고 있는지 확인해야합니다.

 if (Build.VERSION.SDK_INT >= 23) {
      //do your check here
 }

또한 당신의 활동이 OnRequestPermissionResult

전체 권한은 다음과 같습니다.

public  boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {

            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
}

권한 결과 콜백 :

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}

2
@Houssem 도와 드리겠습니다.!
MetaSnarf 2016 년

14
API> = 23에서는 작동하지 않습니다. 권한을 요청하면 Manifest.permission.WRITE_EXTERNAL_STORAGE항상 '-1'이 반환됩니다. 즉 권한이 거부되었습니다. 새 문서를 확인하십시오. API 19 이후에는 WRITE_EXTERNAL_STORAGE권한이 필요하지 않습니다 . 위의 댓글 중 일부는 언급 한 바와 같이, 당신은 함께이 모든 것을해야Manifest.permission.READ_EXTERNAL_STORAGE
AmeyaB

3
@VSB : 이상한 곳이지만 여기 있습니다 : developer.android.com/guide/topics/manifest/…
AmeyaB

3
@AmeyB으로이 문서는 선언 할 필요는 없습니다 외부 저장 장치에 쓰기에 API> = 19 일 허가했다 경우 응용 프로그램에 의해 반환되는 외부 스토리지에 고유의 디렉토리를 사용하는 것입니다 getExternalFilesDir(). 다른 경우에도 여전히 허가 android.permission.WRITE_EXTERNAL_STORAGE는 가장 악의적으로 선언되어야합니다.
VSB

1
그렇습니다. 이 문제는 하키 앱 라이브러리와 관련이 있습니다. 이 라이브러리는 내 쓰기 권한을 무시했습니다. @MetaSnarf
셀린

38

Android의 권한 시스템은 설치시 권한이 요청되기 때문에 가장 큰 보안 문제 중 하나입니다. 일단 설치되면 응용 프로그램은 사용자의 승인없이 부여 된 모든 항목에 액세스 할 수 있습니다.

Android 6.0 Marshmallow는 API 23을 대상으로하고 앱이 Android 6.0 이상 기기에서 실행될 때 기존 설치 시간 권한 모델을 대체하는 새로운 권한 모델 인 런타임 권한을 추가하여 권한 모델의 가장 큰 변경 사항 중 하나를 소개합니다.

의례는 런타임에 권한 요청으로 이동합니다 .

이것을 글로벌로 선언

private static final int PERMISSION_REQUEST_CODE = 1;

onCreate()섹션에 추가

setContentView (R.layout.your_xml);

 if (Build.VERSION.SDK_INT >= 23)
    {
        if (checkPermission())
        {
            // Code for above or equal 23 API Oriented Device 
            // Your Permission granted already .Do next code
        } else {
            requestPermission(); // Code for permission
        }
    }
  else
    {

       // Code for Below 23 API Oriented Device 
       // Do next code
    }

이제 checkPermission ()requestPermission () 추가

 private boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(Your_Activity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (result == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

private void requestPermission() {

    if (ActivityCompat.shouldShowRequestPermissionRationale(Your_Activity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText(Your_Activity.this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
    } else {
        ActivityCompat.requestPermissions(Your_Activity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("value", "Permission Granted, Now you can use local drive .");
            } else {
                Log.e("value", "Permission Denied, You cannot use local drive .");
            }
            break;
    }
}

참고로

onRequestPermissionsResult

이 인터페이스는 권한 요청에 대한 결과를 받기위한 계약입니다.


29

API 레벨 23에서 여러 권한 확인 1 단계 :

 String[] permissions = new String[]{
        Manifest.permission.INTERNET,
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.VIBRATE,
        Manifest.permission.RECORD_AUDIO,
};

2 단계:

 private boolean checkPermissions() {
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p : permissions) {
        result = ContextCompat.checkSelfPermission(this, p);
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 100);
        return false;
    }
    return true;
}

3 단계 :

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == 100) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // do something
        }
        return;
    }
}

4 단계 : onCreate 활동 만들기 checkPermissions ();


2
감사. 이것은 여러 권한에 대한 유망한 답변처럼 보입니다. 그러나 예제에는 약간 부족합니다. never ask again몇 가지 권한을 어떻게 처리 하고 누락합니까? 사용자에게 피드백이 있습니까? 코드 스 니펫에 대한이 주석 이상의 실제 예를 보니 좋을 것입니다.
not2qubit

if (shouldshowpermissionrationale ()) {}으로 차단 된 경우 add to permissions를 다시 묻지 않으려면 권한이 필요하고 영원히 해고되지 않는 경우에 해당합니다.
me_

이것은 정확하고 최적화 된 답변이어야합니다.
VikaS GuttE

21

외부 저장소에 대한 쓰기 요구 사항이없는 한 앱 파일에 파일을 저장하도록 선택할 수 있습니다. 내 경우에는 파일을 저장해야했고 2 ~ 3 일을 낭비한 후 스토리지 경로를 변경했는지 확인했습니다.

Environment.getExternalStorageDirectory()

getApplicationContext().getFilesDir().getPath() //which returns the internal app files directory path

모든 장치에서 매력처럼 작동합니다. 외부 저장소에 쓰려면 추가 권한이 필요하지만 내부 앱 디렉토리에 쓰려면 간단합니다.


이 코드는 어디에 작성합니까? 내 코드에서 Environment.getExternalStorageDiretory ()를 사용하는 것을 기억할 수 없습니다
royjavelosa

5

marshmallow https://developer.android.com/training/permissions/requesting.html 에서 런타임 권한을 사용해야합니다.

앱 정보-> 권한을 체크인 할 수 있습니다

앱에서 외부 저장소 쓰기 권한을 받습니까?


2
실제로이 답변 앱 정보-> 권한이 충돌을 해결했습니다 :), 그러나 나는해야 할 일에 대한 자세한 내용은 다른 답변을 수락했습니다. 감사합니다. ua lot
Badr

안드로이드 에뮬레이터에서 다운로드 문제에 충돌 브라우저 고정 감사합니다
sdaffa23fdsf

4

사용자가 권한을 거부했으며 앱이 외부 디스크에 쓰려고 시도하여 오류가 발생했습니다.

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

https://developer.android.com/training/permissions/requesting.html을 확인 하십시오.

이 비디오는 런타임 권한을 처리하는 UX에 대한 더 나은 아이디어를 제공합니다 https://www.youtube.com/watch?v=iZqDdvhTZj0


1

marshmallow 버전에서 개발자는 사용자에게 런타임 권한을 요청해야합니다. 런타임 권한을 요청하는 전체 프로세스를 알려 드리겠습니다.

여기에서 참조를 사용하고 있습니다 : marshmallow runtime permissions android .

먼저 모든 권한이 부여되는지 여부를 확인하는 메소드를 작성하십시오.

private  boolean checkAndRequestPermissions() {
        int camerapermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        int writepermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int permissionLocation = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
        int permissionRecordAudio = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);


        List<String> listPermissionsNeeded = new ArrayList<>();

        if (camerapermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CAMERA);
        }
        if (writepermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (permissionLocation != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (permissionRecordAudio != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.RECORD_AUDIO);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    } 

이제 위의 방법 후에 실행되는 코드가 있습니다. 우리는 onRequestPermissionsResult()방법 을 재정의 합니다 :

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        Log.d(TAG, "Permission callback called-------");
        switch (requestCode) {
            case REQUEST_ID_MULTIPLE_PERMISSIONS: {

                Map<String, Integer> perms = new HashMap<>();
                // Initialize the map with both permissions
                perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
                // Fill with actual results from user
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i++)
                        perms.put(permissions[i], grantResults[i]);
                    // Check for both permissions
                    if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                            && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, "sms & location services permission granted");
                        // process the normal flow
                        Intent i = new Intent(MainActivity.this, WelcomeActivity.class);
                        startActivity(i);
                        finish();
                        //else any one or both the permissions are not granted
                    } else {
                        Log.d(TAG, "Some permissions are not granted ask again ");
                        //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
//                        // shouldShowRequestPermissionRationale will return true
                        //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
 || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
                            showDialogOK("Service Permissions are required for this app",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            switch (which) {
                                                case DialogInterface.BUTTON_POSITIVE:
                                                    checkAndRequestPermissions();
                                                    break;
                                                case DialogInterface.BUTTON_NEGATIVE:
                                                    // proceed with logic by disabling the related features or quit the app.
                                                    finish();
                                                    break;
                                            }
                                        }
                                    });
                        }
                        //permission is denied (and never ask again is  checked)
                        //shouldShowRequestPermissionRationale will return false
                        else {
                            explain("You need to give some mandatory permissions to continue. Do you want to go to app settings?");
                            //                            //proceed with logic by disabling the related features or quit the app.
                        }
                    }
                }
            }
        }

    }

사용자가 거부 옵션을 클릭하면 showDialogOK()대화 상자를 표시하는 방법이 사용됩니다

에 사용자가 클릭하면 거부 하며 "다시 묻지 않음"라는 체크 박스를 클릭 한 다음 explain()방법은 대화 상자를 표시하는 데 사용됩니다.

대화 상자를 표시하는 방법 :

 private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", okListener)
                .create()
                .show();
    }
    private void explain(String msg){
        final android.support.v7.app.AlertDialog.Builder dialog = new android.support.v7.app.AlertDialog.Builder(this);
        dialog.setMessage(msg)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        //  permissionsclass.requestPermission(type,code);
                        startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.exampledemo.parsaniahardik.marshmallowpermission")));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        finish();
                    }
                });
        dialog.show();
    }

위의 코드 스 니펫은 한 번에 네 가지 권한을 요청합니다. 요구 사항에 따라 활동에 여러 권한을 요청할 수도 있습니다.


0

많은 검색 후이 코드는 저에게 효과적입니다.

권한이 이미 있는지 확인하십시오. WRITE_EXTERNAL_STORAGE 권한을 확인하십시오. 허용됩니까?

if(isReadStorageAllowed()){
            //If permission is already having then showing the toast
            //Toast.makeText(SplashActivity.this,"You already have the permission",Toast.LENGTH_LONG).show();
            //Existing the method with return
            return;
        }else{
            requestStoragePermission();
        }



private boolean isReadStorageAllowed() {
    //Getting the permission status
    int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

    //If permission is granted returning true
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;

    //If permission is not granted returning false
    return false;
}

//Requesting permission
private void requestStoragePermission(){

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }

    //And finally ask for the permission
    ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE_STORAGE);
}

사용자가 허용 또는 거부하는지 확인하기위한 onRequestPermissionsResult 메소드 대체를 구현하십시오.

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    //Checking the request code of our request
    if(requestCode == REQUEST_WRITE_STORAGE){

        //If permission is granted
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            //Displaying a toast
            Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();

        }else{
            //Displaying another toast if permission is not granted
            Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
        }
    }

0

그것은 나를 위해 일했다

 boolean hasPermission = (ContextCompat.checkSelfPermission(AddContactActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
    if (!hasPermission) {
        ActivityCompat.requestPermissions(AddContactActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
    }

   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(AddContactActivity.this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}

0
   Try this



int permission = ContextCompat.checkSelfPermission(MainActivity.this,
                    android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

     if (permission != PackageManager.PERMISSION_GRANTED) {
                Log.i("grant", "Permission to record denied");

                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage(getString(R.string.permsg))
                            .setTitle(getString(R.string.permtitle));

                    builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            Log.i("grant", "Clicked");
                            makeRequest();
                        }
                    });

                    AlertDialog dialog = builder.create();
                    dialog.show();

                } else {

                    //makeRequest1();
                    makeRequest();
                }
            }


     protected void makeRequest() {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    500);
        }



     @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case 500: {

                    if (grantResults.length == 0
                            || grantResults[0] !=
                            PackageManager.PERMISSION_GRANTED) {

                        Log.i("1", "Permission has been denied by user");

                    } else {

                        Log.i("1", "Permission has been granted by user");

                    }
                    return;
                }

            }
        }

0

다운로드를 시작하기 전에 런타임 권한을 확인하고 권한이없는 경우이 방법과 같은 요청 권한

requestStoragePermission ()

private void requestStoragePermission(){
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
                android.Manifest.permission.READ_EXTERNAL_STORAGE))
        {

        }

        ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            STORAGE_PERMISSION_CODE);
}

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

    if(requestCode == STORAGE_PERMISSION_CODE){
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        }
        else{
            Toast.makeText(this,
                           "Oops you just denied the permission", 
                           Toast.LENGTH_LONG).show();
        }
    }
}

0

간단한 방법으로 manifest.xml 파일을 사용하여 권한을 부여 할 수 있지만 권한을 얻으려면 API 레벨 23 SDK 버전 6까지 괜찮습니다. 허가를 얻으려면 권한을 허용하도록 요청해야합니다. 필요합니다.

이 코드를 mainActivity.java에 추가하십시오.

Override
            public void onClick(View view) {
                // Request the permission
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA},
                        PERMISSION_REQUEST_CAMERA);

원하는 경우 CAMERA를 교체하거나 원하는 경우 WRITE_EXTERNAL_STORAGE 및 고유 코드로 추가하십시오.

                            new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    101);

이것은 권한을 얻는 간단한 코드입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.