💚 개발/ė•ˆë“œëĄœė´ë“œ

[ė•ˆë“œëĄœė´ë“œ] ëŸ°íƒ€ėž„ė— ęļŒí•œ 랴íŦ하는 방법

devshin.kr 2022. 1. 5. 16:18
728x90

두 氀맀 ėƒ˜í”Œ ėŊ”ë“œę°€ ėžˆë‹¤.

Case 1. í•˜ë‚˜ė˜ ęļŒí•œë§Œ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ

Case 2. ë‘ ę°€ė§€ ė´ėƒė˜ ęļŒí•œė„ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ

Case 1. í•˜ë‚˜ė˜ ęļŒí•œë§Œ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ ë™ėž‘ ė˜ˆė‹œ

ALLOW ëĨŧ 누ëĨ´ëŠ´ 바로 ęļŒí•œė´ ëļ€ė—Ŧ 된다.
DENY > ė•ŒëĻŧė°Ŋ (í™•ė¸) > 네렕 ėœŧ로 ė—°ę˛°ë˜ëŠ° ė‚ŦėšŠėžę°€ ęļŒí•œė„ 뗴떴뤄 눘 ėžˆë„ëĄ 한다.

 

 

 

Case 1. í•˜ë‚˜ė˜ ęļŒí•œë§Œ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ ėŊ”드

ė´ ëļ€ëļ„ë§Œ ėļ”가해 뤀 것

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

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devshin93.runtimepermission">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.RuntimePermission">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

MainActivity.java

package com.devshin93.runtimepermission;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    private static final int SINGLE_PERMISSION = 1004;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        runtimeCheckPermission();
    }

    public void runtimeCheckPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, SINGLE_PERMISSION);
        } else {
            Log.i("ęļŒí•œ í…ŒėŠ¤íŠ¸", "ė˛˜ėŒëļ€í„° ęļŒí•œė´ ėžˆė—ˆė–´ėš”.");
        }
    }

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

        switch (requestCode) {
            case SINGLE_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // ęļŒí•œė´ ė´ë¯¸ ėžˆëŠ” ę˛Ŋ뚰
                    Log.i("ęļŒí•œ í…ŒėŠ¤íŠ¸", "ė‚ŦėšŠėžę°€ ęļŒí•œė„ ëļ€ė—Ŧ해 ė¤ŦėŠĩ니다.");
                } else {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
                    alertDialog.setTitle("ė•ą ęļŒí•œ 네렕");
                    alertDialog.setMessage("네렕ėœŧ로 ė´ë™í•Šë‹ˆë‹¤.");
                    alertDialog.setPositiveButton("í™•ė¸",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    // ė´ ëļ€ëļ„ė€ 네렕ėœŧ로 ė´ë™í•˜ëŠ” ėŊ”ë“œė´ë¯€ëĄœ ė•ˆë“œëĄœė´ë“œ 뚴똁랴렜 ë˛„ė „ė— 따ëŧ ėƒė´í•  눘 ėžˆë‹¤.
                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                                    startActivity(intent);
                                    dialogInterface.cancel();
                                }
                            });

                    alertDialog.setNegativeButton("ėˇ¨ė†Œ", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.cancel();
                        }
                    });

                    alertDialog.show();
                }
        }
    }
}

 

 

 

 

 

Case 2. 두 氀맀 ė´ėƒė˜ ęļŒí•œė„ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ ë™ėž‘ ė˜ˆė‹œ

ALLOW 하면 바로 ęļŒí•œė´ ëļ€ė—Ŧ 된다.
DENY > ė•ŒëžŒė°Ŋ (í™•ė¸) > 네렕 ėœŧ로 ė—°ę˛°ë˜ëŠ° ė‚ŦėšŠėžę°€ ęļŒí•œė„ 뤄 눘 ėžˆë„ëĄ 한다.

 

 

Case 2. 두 氀맀 ė´ėƒė˜ ęļŒí•œė„ ėš”ė˛­í•˜ëŠ” ėŧ€ė´ėФ ėŊ”드

ė—Ŧę¸°ė„œëŠ” 뙏ëļ€ė €ėžĨė†Œ(sdcard) 뗐 read/write ęļŒí•œė„ ëļ€ė—Ŧ하도록 했다. Android API Level 30 ëļ€í„°ëŠ” ė ėšŠė´ ė•ˆ 되니 다ëĨ¸ ęļŒí•œėœŧ로 í…ŒėŠ¤íŠ¸ 해 ëŗ´ęą°ë‚˜, í…ŒėŠ¤íŠ¸ 단말기/ė• ëŽŦë ˆė´í„°ė˜ ë˛„ė „ė„ 낮ėļ”ėž.

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

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devshin93.runtimepermissions">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.RunTimePermissions">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

MainActivity.java

package com.devshin93.runtimepermissions;

import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

public class MainActivity extends AppCompatActivity {

    private static final int MULTIPLE_PERMISSION = 1004;

    /**
     * 뙏ëļ€ė €ėžĨė†Œ (sdcard) 뗐 read/write 하는 ėƒ˜í”Œėž…ë‹ˆë‹¤.
     * Android API level 30 ëļ€í„°ëŠ” sdcard 뗐 ė ‘ęˇŧė´ ëļˆę°€í•  눘 ėžˆėŠĩ니다.
     * í…ŒėŠ¤íŠ¸í•˜ëŠ” 단말기/ė• ëŽŦë ˆė´í„°ė˜ ë˛„ė „ė„ 30 미만ėœŧ로 낮ėļ”ęą°ë‚˜
     * ė•„ëž˜ PERMISSIONS ëĒŠëĄė„ CAMERA 등ėœŧ로 ëŗ€ę˛Ŋí•˜ė‹œëŠ´ 됩니다.
     */
    private String[] PERMISSIONS = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (!runtimeCheckPermission(this, PERMISSIONS)) {
            ActivityCompat.requestPermissions(this, PERMISSIONS, MULTIPLE_PERMISSION);
        } else {
            // ęļŒí•œė´ ėžˆëŠ” ę˛Ŋ뚰..
            Log.i("ęļŒí•œ í…ŒėŠ¤íŠ¸", "ęļŒí•œė´ ėžˆë„¤ėš”");
        }
    }

    public boolean runtimeCheckPermission(Context context, String... permissions) {
        if (context != null && permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }

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

        switch (requestCode) {
            case MULTIPLE_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // ęļŒí•œė´ ėžˆë‹¤ëŠ´~
                    Log.i("ęļŒí•œ í…ŒėŠ¤íŠ¸", "ė‚ŦėšŠėžę°€ ęļŒí•œė„ ëļ€ė—Ŧ해 ė¤ŦėŠĩ니다.");
                } else {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
                    alertDialog.setTitle("ė•ą ęļŒí•œ 네렕");
                    alertDialog.setMessage("네렕ėœŧ로 ė´ë™í•Šë‹ˆë‹¤.");
                    alertDialog.setPositiveButton("í™•ė¸", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // ė´ ëļ€ëļ„ė€ 네렕ėœŧ로 ė´ë™í•˜ëŠ” ėŊ”ë“œė´ë¯€ëĄœ ė•ˆë“œëĄœė´ë“œ 뚴똁랴렜 ë˛„ė „ė— 따ëŧ ėƒė´í•  눘 ėžˆë‹¤.
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                            startActivity(intent);
                            dialogInterface.cancel();
                        }
                    });

                    alertDialog.setNegativeButton("ėˇ¨ė†Œ", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.cancel();
                        }
                    });

                    alertDialog.show();
                }
        }
    }
}