본문 바로가기
Android/소스

Android BaseActivity 퍼미션 등록 및 프래그먼트 액티비티 등록.

by 므시칸곰틔군 2018. 6. 5.

안드로이드 베이스액티비티

프래그먼트 등록 및 액티비티 전환 메서드.

안드로이드 퍼미션 대응 


public abstract class BaseActivity extends AppCompatActivity {



    @Override

    public void onBackPressed() {


        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {


            //뒤로가기 2초 종료 유도

            super.onBackPressed();

        } else {

            super.onBackPressed();

        }



    }


    /**

     * add 를 했을 때 액티비티에서 종료를 하면 앱이 0으로 표시된다.

     */

    public void addFragment(int id, Fragment fragment) {

        addFragment(id, fragment, null);

    }


    public void addFragment(int id, Fragment fragment, String tagName) {

        getSupportFragmentManager().beginTransaction().add(id, fragment, tagName).commit();

    }


    /**

     * 프래그먼트 전환.

     * 액티비티에서 앱을 종료하면 이건 1이 된다.

     */

    public void replaceFragment(int id, Fragment fragment) {

        replaceFragment(id, fragment, null);

    }


    public void replaceFragment(int id, Fragment fragment, String backStackName) {


        getSupportFragmentManager().beginTransaction().replace(id, fragment)

                // 백스텍에 이름이 없거나 널이면 프래그먼트클래스 이름을 등록

                .addToBackStack(backStackName).commit();

    }



    public void removeFragment(Fragment fragment) {


        getSupportFragmentManager().beginTransaction().remove(fragment).commit();

    }


    public void removeFragment(Fragment fragment, String backStackName) {


        getSupportFragmentManager().beginTransaction().remove(fragment)

                // 백스텍에 이름이 없거나 널이면 프래그먼트클래스 이름을 등록

                .addToBackStack(backStackName).commit();

    }


    /**

     * 액티비티 전환

     */

    public void changeActivity(Context context, Class<?> activity, boolean activityFinish) {


        Intent intent = new Intent(context, activity);


        startActivity(intent);

        if (activityFinish) {

            finish();

        }

    }



    /**

     * 퍼미션 체크 인터페이스

     */

    public interface PermissionCheckListener {

        /**

         * 퍼미션 허용이 끝나면 끝나는 시점 초기화 시작구간을 콜백으로 구현

         * 어디서든 등록하고 액티비티에서 콜백으로 지정을 한다

         */

        void permissionCheckFinish();

    }


    private PermissionCheckListener permissionCheckListener;


    public PermissionCheckListener getPermissionCheckListener() {

        return permissionCheckListener;

    }


    /**

     * 제일 먼저 등록

     */

    public void setPermissionCheckListener(PermissionCheckListener permissionCheckListener) {

        this.permissionCheckListener = permissionCheckListener;

    }


    /**

     * 퍼미션 권한 리퀘스트 코드

     */

    private final int PERMISSION_REQUEST = 11000;


    /**

     * 스트링 배열로 퍼미션 체크.<p>

     * true 면 퍼미션 승인 안한 것이 존재함<p>

     * onRequestPermissionsResult 로 넘어감

     */

    public boolean permissionCheck(String[] strings) {

        boolean check = false;


        // //안드로이드 마시멜로 이후 퍼미션 체크.

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


            for (int i = 0; i < strings.length; i++) {

                if (ContextCompat.checkSelfPermission(this, strings[i]) == PackageManager.PERMISSION_DENIED) {

                    ActivityCompat.requestPermissions(this, strings, PERMISSION_REQUEST);

                    check = true;

                    break;

                }

            }

        }

        return check;

    }



    @Override

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


        super.onRequestPermissionsResult(requestCode, permissions, grantResults);


        if (requestCode == PERMISSION_REQUEST) {


            //LogUtil.e("권한 허용이 안된것을 확인해야한다..");

            // //안드로이드 마시멜로 이후 퍼미션 체크.

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


                for (int i = 0; i < grantResults.length; i++) {

                    if (grantResults[i] == 0) {

                        //LogUtil.w("권한이 승락된 것은 ??? " + permissions[i]);


                        if (grantResults.length == (i + 1)) {

                            //LogUtil.e("인터페이스로 한곳에 모아서 앱을 실행하도록 한다...");

                            // 앱 시작구간이라고 보면 된다

                            permissionCheckListener.permissionCheckFinish();

                        }


                    } else {

                        //LogUtil.w("권한 거절 것은 ??? " + permissions[i]);


                        // 거부한 이력이 있으면 true를 반환한다.

                        if (shouldShowRequestPermissionRationale(permissions[i])) {

                            //LogUtil.e("사용자가 다시 보지 않기에 체크를 하지 않고, 권한 설정을 거절한 이력이 있는 경우");

                            ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);

                            break;


                        } else {

                            //LogUtil.e("사용자가 다시 보지 않기에 체크하고, 권한 설정을 거절한 이력이 있는 경우.");


                            new AlertDialog.Builder(this).setTitle("다시보지않기 클릭.").setMessage(permissions[i] + " 권한이 거부되었습니다 설정에서 직접 권한을 허용 해주세요.").setNeutralButton("설정", new DialogInterface.OnClickListener() {

                                @Override

                                public void onClick(DialogInterface dialog, int which) {

                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

                                    intent.setData(Uri.parse("package:" + getPackageName()));

                                    startActivity(intent);

                                    Toast.makeText(getApplicationContext(), "권한 설정 후 다시 실행 해주세요.", Toast.LENGTH_SHORT).show();

                                    finish();

                                }

                            }).setPositiveButton("확인", new DialogInterface.OnClickListener() {

                                @Override

                                public void onClick(DialogInterface dialog, int which) {

                                    Toast.makeText(getApplicationContext(), "권한 설정을 하셔야 앱을 사용할 수 있습니다.", Toast.LENGTH_SHORT).show();

                                    finish();

                                }

                            }).setCancelable(false).create().show();

                        }// shouldShowRequestPermissionRationale /else

                    } // 권한 거절

                } // for end

            }//Build.VERSION.SDK_INT  end

        }//requestCode  end

    }

}



MainActivity

public class MainActivity extends BaseActivity {


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


        setPermissionCheckListener(new PermissionCheckListener() {
            @Override
            public void permissionCheckFinish() {
                // 앱 시작구간

            }
        });
// 체크 구문 예시//
        if (permissionCheck(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})) {
            return;
        }

        getPermissionCheckListener().permissionCheckFinish();

    }
}





'Android > 소스' 카테고리의 다른 글

코틀린 MVP 패턴 기본  (0) 2018.07.17
디펜던시.  (0) 2018.06.04
안드로이드 연속클릭 방지 클래스.  (0) 2018.05.23
안드로이드 퍼미션 권한 관련  (0) 2018.04.17
안드로이드 리스트뷰 예제  (0) 2018.03.22