본문 바로가기
Android

안드로이드 바로가기 아이콘 생성하기 오레오 이상/이하 호환.

by 일용직 코딩노동자 2020. 4. 20.
728x90
반응형

바탕화면에 바로가기 아이콘을 생성할건지 묻는 알림창을 자주 보셨을겁니다.

 

이것에 대해 한번 포스팅해볼게요.

 

우선 퍼미션을 얻어야겠지요?

 

<!-- 앱 설치 후 바로가기 생성 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
    <!-- 앱 설치 후 바로가기 생성 -->

설치와 제거를 할 수 있는 퍼미션을 추가해줍니다.

 

private void Create_Shortcut() {

        SharedPreferences Get_ShortCut = getSharedPreferences("Shortcut",MODE_PRIVATE);
        Var.Shortcut_Check = Get_ShortCut.getBoolean("Shortcut",false);

        if(!Var.Shortcut_Check) {
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
            dialogBuilder.setTitle("알 림");
            dialogBuilder.setIcon(R.drawable.icon);
            dialogBuilder.setMessage("테스트 어플 바로가기 아이콘을\n홈 화면에 추가 하시겠습니까?");
            dialogBuilder.setPositiveButton("확인", this);
            dialogBuilder.setNegativeButton("취소", this);
            dialogBuilder.show();
        }
    }

현재 간단히 이렇게 세팅만 해주었습니다.

 

앱을 킬 때마다 바로가기를 생성 여부를 물어보면 사용자가 좀 많이 화가 나겠죠?

 

SharedPreferences로 막아줍니다. 

 

확인버튼 눌러도 true 취소버튼 눌러도 true입니다.

 

트루가 아닐때만 작동하도록 if문을 걸어주었습니다. 

 

SharedPreferences로 저장하는 변수는 boolean타입의 변수를 하나 사용했습니다.

 

변수명은 자유롭게 지정해주세요.

 

그리고 클릭 이벤트 관련은

 

@Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
            case -2: //취소
                Shortcut_Preferences = getSharedPreferences("Shortcut",MODE_PRIVATE);
                SharedPreferences.Editor Shortcut_Editor = Shortcut_Preferences.edit();
                Var.Shortcut_Check = true;
                Shortcut_Editor.putBoolean("Shortcut",true);
                Shortcut_Editor.commit();
                break;
            case -1: //확인
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    Intent action = new Intent(Intent.ACTION_VIEW).setClass(getApplicationContext(),MainActivity.class);

                    ShortcutManager shortcutManager = getApplicationContext().getSystemService(ShortcutManager.class);
                    if (shortcutManager.isRequestPinShortcutSupported()) {
                        ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(getApplicationContext(), "테스트 어플")
                                .setIntent(action)
                                .setShortLabel("테스트 어플")
                                .setIcon(Icon.createWithResource(getApplicationContext(), R.drawable.icon)).build(); //아이콘설정
                        Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo);
                        PendingIntent successCallback = PendingIntent.getBroadcast(getApplicationContext(), 0, pinnedShortcutCallbackIntent, 0);

                        shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender());
                    }
                }
                else {
                    Intent shortcutIntent = new Intent(Intent.ACTION_VIEW);
                    shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                    shortcutIntent.setClassName(getApplicationContext(), getClass().getName());
                    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

                    Intent intent = new Intent();
                    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
                    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "테스트 어플");
                    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                            Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.icon));

                    intent.putExtra("duplicate", false);
                    intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

                    sendBroadcast(intent);
                }
                Shortcut_Preferences = getSharedPreferences("Shortcut",MODE_PRIVATE);
                SharedPreferences.Editor Shortcut_Editor2 = Shortcut_Preferences.edit();
                Var.Shortcut_Check = true;
                Shortcut_Editor2.putBoolean("Shortcut",true);
                Shortcut_Editor2.commit();
                break;
        }
    }

이렇게 따로 처리해 주었습니다.

 

클래스딴 전역으로 

SharedPreferences Shortcut_Preferences;

선언 하나 해주세여.

 

 

그리고 메인 클래스에

public class MainActivity extends AppCompatActivity implements AlertDialog.OnClickListener

인터페이스 하나 상속 해주셔야합니다.

 

굳이 따로 클릭을 처리한 이유는 어째서인지 일반적인 버튼 리스너나 다이얼로그의 버튼리스너에서는

 

안드로이드 8.0 밑에버전의 바로가기생성 코드가 먹히지 않았습니다.

 

혹시 이유를 아시는분은 댓글 부탁드릴게요!

728x90
반응형

댓글