내 소소한..

AutoPermissions 사용 시 permission cannot be null or empty 가 나올 때 본문

IT/Android

AutoPermissions 사용 시 permission cannot be null or empty 가 나올 때

쿠르릉 2021. 2. 13. 15:22

책과 인터넷에서 AutoPermissions 1.0.3을 사용하는 예제를 따라가다 보면 아래와 같은 에러가 발생하고 앱이 크래시된다.

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.receivesms/com.example.receivesms.MainActivity}: java.lang.IllegalArgumentException: permission cannot be null or empty
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.IllegalArgumentException: permission cannot be null or empty
        at android.content.pm.PackageManager.buildRequestPermissionsIntent(PackageManager.java:3461)
        at android.app.Activity.requestPermissions(Activity.java:4366)
        at androidx.core.app.ActivityCompat.requestPermissions(ActivityCompat.java:502)
        at com.pedro.library.AutoPermissions$Companion.loadActivityPermissions(AutoPermissions.kt:74)
        at com.example.receivesms.MainActivity.onCreate(MainActivity.java:20)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)

permission cannot be null or empty <- 이 메시지가 핵심이다.

 

일반적인 예제에서 제공되는 코드는 다음과 같다.

public class MainActivity extends AppCompatActivity implements AutoPermissionsListener {

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

        AutoPermissions.Companion.loadActivityPermissions(this, 101);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d("Main", "onRequestPermissionsResult 호출됨");
        AutoPermissions.Companion.parsePermissions(this, requestCode, permissions, this);
    }

    @Override
    public void onDenied(int reqCode, String[] perms) {
        Log.d("Main", "onDenied 호출됨");
        Toast.makeText(this, "권한거부:"+perms.length, Toast.LENGTH_LONG).show();
        for ( String perm: perms ) {
            Log.d("Main", "거부: "+perm);
        }
    }

    @Override
    public void onGranted(int reqCode, String[] perms) {
        Log.d("Main", "onGranted 호출됨");
        Toast.makeText(this, "권한허용:"+perms.length, Toast.LENGTH_LONG).show();
        for ( String perm: perms ) {
            Log.d("Main", "허용: "+perm);
        }
    }
}

Exception이 발생한 MainActivity의 20번째 라인은 AutoPermissions.Companion.loadActivityPermissions(this, 101); 부분이다. (위 코드에서는 8번째 라인..)

 

원인

loadActivityPermissions 메서드를 사용할 때는 AndroidManifest.xml 파일 내 <activity> 프래그먼트 내에 meta-data 정의가 필요하다.

 

해결책 1

위 코드에서 AutoPermissions.Companion.loadActivityPermissions(this, 101); 을  AutoPermissions.Companion.loadAllPermissions(this, 1); 로 교체한다.

 

해결책 2

AndroidManifest.xml 파일 내 activity 프래그먼트 내에 meta-data를 추가한다.

<meta-data android:name="@string/permissions_loader_meta_key" android:value="android.permission.RECEIVE_SMS"/> 같은 형태로, value는 ,로 구분해서 여러 가지 위험 권한을 지정할 수 있다.

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="@string/permissions_loader_meta_key"
                android:value="android.permission.RECEIVE_SMS"/>
        </activity>

 

Comments