私藏的开发过程中的那些基类

Activity

说明: Activity基类

  1. 让子类方便的获取tag
  2. 让子类方便的getActvity
  3. 默认设置竖屏锁定
  4. 模版方法模式让子类可以方便的进行数据填充代码编写
  5. findView让子类省去findViewByid的强转,更方便的获取xml组件
  6. showLoading和hideLoading可以方便的进行loading弹出
package com.zhiup.base.base;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.WindowManager;

import com.umeng.analytics.MobclickAgent;
import com.zhiup.base.R;
import com.zhiup.base.bus.GoToLoginBus;
import com.zhiup.base.utils.RxBus;
import com.zhiup.base.view.dialog.DialogBuilder;
import com.zhiup.base.view.loading.LoadingDialog;

/**
 * Created by 63453 on 2017/8/11.
 */

public abstract class BaseActivity extends AppCompatActivity {
    public String getTag(){
        return getClass().getName();
    }//为了每个Activity打日志
    public Activity getActivity(){
        return this;
    }
    private LoadingDialog mLoadingDialog;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置竖屏锁定
        init();
    }

    protected void onResume() {
        super.onResume();
        MobclickAgent.onResume(this);
    }
    protected void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
//        MobclickAgent.setCatchUncaughtExceptions(false);
    }

    protected abstract int getLayoutId();//本activity的layoutID
    protected abstract void initView();//初始化view
    protected abstract void initData();//初始化View的数据
    protected abstract void initEvent();//初始化事件点击
    protected void initPresenter(){}//初始化presenter

    private final void init(){
        setContentView(getLayoutId());
        initTitle();
        initView();
        initData();
        initPresenter();
        initEvent();
    }

    protected void initTitle(){}


    /**
     * 利用泛型直接获取View 外面无需强制转换
     * @param id  传入view的ID
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    protected <T extends View>T findView(int id){
        return (T)findViewById(id);
    }

    public synchronized void showLoading(Activity act) {
        if (mLoadingDialog == null) {
            mLoadingDialog = new LoadingDialog(act);
            mLoadingDialog.setCanceledOnTouchOutside(false);
        }
        if (!mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {
            mLoadingDialog.show();
        }
    }

    public synchronized void hideLoading(Activity act) {
        if (mLoadingDialog != null && mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {
            mLoadingDialog.dismiss();
            mLoadingDialog=null;
        }
    }
}

复制代码

BaseActivityListView

说明: MVP模式中 带list的Activity的View基类 BaseActivityListView

package com.zhiup.base.base;

/**
 * Created by zhou on 2017/12/22.
 */

public interface BaseActivityListView extends BaseActivityView{
    void showLoading();
    void showDataNull();
    void showNetError();
    void hiddenPrompt();
    void hideLoading();
}
复制代码

BaseActivityView

说明: MVP模式中Activity的view基类

package com.zhiup.base.base;

import android.app.Activity;

/**
 * Created by zhou on 2017/8/17 17:50 .
 */

public interface BaseActivityView {
    Activity getActivity();
}
复制代码

BaseApplication

说明: 主程序中Application基类

package com.zhiup.base.base;

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.os.Handler;

import com.zhiup.base.utils.LogUtils;


/**
 * Created by zhou on 2017/8/25 15:41 .
 * 应用程序基本Application
 */

public abstract class BaseApplication extends Application{
    private Handler mDelivery;//拥有主线程的Handler,主要做主线程处理分发
    private static BaseApplication gInstance;

    public static final BaseApplication getInstance()
    {
        if(gInstance==null) throw new RuntimeException();
        return gInstance;
    }

    public void runOnMainThread(Runnable runnable,long delayTime){
        mDelivery.postDelayed(runnable,delayTime);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        this.gInstance = this;
        mDelivery = new Handler(getMainLooper());
        initLog();
        if(isMainProcess()){//主进程执行此方法
            onMainProc();//留给子类执行
            initComponent();//父类第三方组件初始化动作
        }
    }

    /**
     * 初始化组件.
     */
    private void initComponent(){
    }

    //只有主进程才执行此方法,其他进程不执行.增加app启动速度,减少Application内存cpu等消耗
    public abstract void onMainProc();

    /**
     * 获取当前进程名
     */
    private String getCurrentProcessName() {
        int pid = android.os.Process.myPid();
        String processName = "";
        ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {
            if (process.pid == pid) {
                processName = process.processName;
            }
        }
        return processName;
    }

    /**
     * 包名判断是否为主进程
     *
     * @param
     * @return
     */
    public boolean isMainProcess() {
        return getApplicationContext().getPackageName().equals(getCurrentProcessName());
    }


    /**
     * 初始化Log日志打印
     */
    public void initLog() {
        LogUtils.Config config = LogUtils.getConfig()
                .setLogSwitch(true)// 设置log总开关,包括输出到控制台和文件,默认开
                .setConsoleSwitch(true)// 设置是否输出到控制台开关,默认开
                .setGlobalTag(null)// 设置log全局标签,默认为空
                // 当全局标签不为空时,我们输出的log全部为该tag,
                // 为空时,如果传入的tag为空那就显示类名,否则显示tag
                .setLogHeadSwitch(true)// 设置log头信息开关,默认为开
                .setLog2FileSwitch(false)// 打印log时是否存到文件的开关,默认关
                .setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中
                .setFilePrefix("")// 当文件前缀为空时,默认为"util",即写入文件为"util-MM-dd.txt"
                .setBorderSwitch(true)// 输出日志是否带边框开关,默认开
                .setConsoleFilter(LogUtils.V)// log的控制台过滤器,和logcat过滤器同理,默认Verbose
                .setFileFilter(LogUtils.V)// log文件过滤器,和logcat过滤器同理,默认Verbose
                .setStackDeep(1);// log栈深度,默认为1
        LogUtils.d(config.toString());
    }
}

复制代码

BaseBean

说明: BaseBean基类用于混淆配置,Serializable可以去掉 kotlin代码编写

package com.zhiup.base.base;

import java.io.Serializable

/**
 * Created by zhou on 2017/12/19.
 */

interface BaseBean:Serializable{
}

复制代码

BaseDialogFragment

说明: dialog基类

package com.zhiup.base.base;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;

import com.blankj.utilcode.util.ScreenUtils;

/**
 * Created by zhou on 2017/12/7.
 */

public abstract class BaseDialogFragment extends DialogFragment {
    private View mView;
    protected int mScreenWidth = ScreenUtils.getScreenWidth();
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getDialog().getWindow();
        window.setGravity(setGravity());
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        mView = inflater.inflate(getLayoutId(), container,false);
        init();
        return mView;
    }

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout((int)getDialogWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    private void init(){
        initView();
        initData();
        initEvent();
    }

    protected abstract int getLayoutId();
    protected abstract void initView();
    protected abstract void initData();
    protected abstract void initEvent();


    public View getmView(){
        return mView;
    }

    protected float getDialogWidth(){
        return mScreenWidth;
    }

    protected int setGravity() {
        return Gravity.CENTER;
    }
}

复制代码

BaseFragment

说明:Fraagment基类

package com.zhiup.base.base;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.zhiup.base.view.loading.LoadingDialog;

/**
 * Created by zhou on 2017/11/7 17:30 .
 */

public abstract class BaseFragment extends Fragment {
    private LoadingDialog mLoadingDialog;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(getLayoutId(),container,false);
        initTitle(v);
        return v;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        init();
        initData();
        initEvent();
    }

    public abstract int getLayoutId();

    public abstract void init();

    public void initTitle(View v){}

    public abstract void initEvent();

    public abstract void initData();

    public void showLoading() {
        showLoading(getActivity());
    }

    public void hideLoading() {
        hideLoading(getActivity());
    }

    /**
     * 利用泛型直接获取View 外面无需强制转换
     * @param id  传入view的ID
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    protected <T extends View>T findView(int id){
        return (T) getView().findViewById(id);
    }

    public synchronized void showLoading(Activity act) {
        if (mLoadingDialog == null) {
            mLoadingDialog = new LoadingDialog(act);
            mLoadingDialog.setCanceledOnTouchOutside(false);
        }
        if (!mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {
            mLoadingDialog.show();
        }
    }

    public synchronized void hideLoading(Activity act) {
        if (mLoadingDialog != null && mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {
            mLoadingDialog.dismiss();
            mLoadingDialog=null;
        }
    }

}

复制代码

BaseFragmentView

说明:MVP模式中Fragment的view基类

package com.zhiup.base.base;

import android.content.Context;

/**
 * Created by zhou on 2017/8/17 17:50 .
 */

public interface BaseFragmentView {
    Context getContext();
}

复制代码

BaseInputMethodActivity

说明:

package com.zhiup.base.base;

import android.content.Context;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

import com.zhiup.base.utils.LogUtils;

/**
 * Created by zhou on 2017/11/15 10:31 .
 */

public abstract class BaseInputMethodActivity extends BaseActivity{

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideKeyboard(v, ev)) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
    private boolean isShouldHideKeyboard(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] l = {0, 0};
            v.getLocationInWindow(l);
            int left = l[0],
                    top = l[1],
                    bottom = top + v.getHeight(),
                    right = left + v.getWidth();
            return !(event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom);
        }
        return false;
    }

    private boolean isKeyboardShown(View rootView) {
        final int softKeyboardHeight = 100;
        Rect frame = new Rect();
        rootView.getWindowVisibleDisplayFrame(frame);
        DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
        int heightDiff = rootView.getBottom() - frame.bottom;
        LogUtils.d("" + rootView.getBottom() + ", " + frame.bottom + ", " + heightDiff);
        return heightDiff > softKeyboardHeight * dm.density;
    }
}

复制代码

BaseLazyFragment

说明:

package com.zhiup.base.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;


/**
 * Created by zhou on 2017/11/7 17:30 .
 */

public abstract class BaseLazyFragment extends BasePermissionFragment {
    /**
     * 控件是否初始化完成
     */
    private boolean isViewCreated;
    /**
     * 数据是否已加载完毕
     */
    private boolean isLoadDataCompleted;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {
            isLoadDataCompleted = true;
            inVisiableLoad();
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        isViewCreated = true;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (getUserVisibleHint()) {//当前可见则加载,否则由上面的setUserVisibleHint加载数据
            isLoadDataCompleted = true;
            inVisiableLoad();
        }
    }

    public abstract void inVisiableLoad();

}

复制代码

BasePermissionActivity

说明:

package com.zhiup.base.base;

import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;

/**
 * Created by zhou on 2017/9/28.
 * 用于处理权限的基类 activity
 */

public abstract class BasePermissionActivity extends BaseActivity{

    //下面是权限相关代码----------------------------------------!
    /**
     * 权限回调Handler
     */
    private PermissionHandler mHandler;
    /**
     * 请求权限
     *
     * @param permissions 权限列表
     * @param handler     回调
     */
    public void requestPermission(String[] permissions, PermissionHandler handler) {
        String permissionArr[] = PermissionUtils.hasSelfPermissions(this, permissions);
        if (permissionArr.length==0) {
            handler.onGranted();
        } else {
            mHandler = handler;
            ActivityCompat.requestPermissions(this, permissionArr, 1);
        }
    }
    /**
     * 权限请求结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (mHandler == null) return;

//        if (PermissionUtils.getTargetSdkVersion(this) < 23 && !PermissionUtils.hasSelfPermissions(this, permissions)) {
//            mHandler.onDenied();
//            return;
//        }

        if (PermissionUtils.verifyPermissions(grantResults)) {
            mHandler.onGranted();
        } else {
            if (!PermissionUtils.shouldShowRequestPermissionRationale(this, permissions)) {
                if (!mHandler.onNeverAsk()) {
                    Toast.makeText(this, "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show();
                }

            } else {
                mHandler.onDenied();
            }
        }
    }
}
复制代码

BasePermissionFragment

说明:

package com.zhiup.base.base;

import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;

/**
 * @author zcz
 * @date 2017/11/29
 */
public abstract class BasePermissionFragment extends BaseFragment {

    /**
     * 权限回调Handler
     */
    private PermissionHandler mHandler;

    /**
     * 请求权限
     *
     * @param permissions 权限列表
     * @param handler     回调
     */
    public void requestPermission(String[] permissions, PermissionHandler handler) {
        String permissionArr[] = PermissionUtils.hasSelfPermissions(getActivity(), permissions);
        if (permissionArr.length==0) {
            handler.onGranted();
        } else {
            mHandler = handler;
            ActivityCompat.requestPermissions(getActivity(), permissionArr, 1);
        }
    }


    /**
     * 权限请求结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (mHandler == null) return;

        //        if (PermissionUtils.getTargetSdkVersion(this) < 23 && !PermissionUtils.hasSelfPermissions(this, permissions)) {
        //            mHandler.onDenied();
        //            return;
        //        }

        if (PermissionUtils.verifyPermissions(grantResults)) {
            mHandler.onGranted();
        } else {
            if (!PermissionUtils.shouldShowRequestPermissionRationale(getActivity(), permissions)) {
                if (!mHandler.onNeverAsk()) {
                    Toast.makeText(getActivity(), "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show();
                }

            } else {
                mHandler.onDenied();
            }
        }
    }
}

复制代码

BasePresenter

说明:

package com.zhiup.base.base;

import java.lang.ref.WeakReference;

/**
 * Created by 63453 on 2017/8/12.
 */

public abstract class BasePresenter<T> {
    protected WeakReference<T> mView;
    public BasePresenter(T view){
        this.mView = new WeakReference<>(view);
    }
    public T getView() {
        return mView.get();
    }

    /**
     * 做销毁时移除数据
     */
    public void onDestroy(){
        if (mView != null) {
            mView.clear();
//            mView = null;暂时不能置为空,会引起退出activity时getView空指针
        }
    }



}

复制代码

BaseResult

说明:

package com.zhiup.base.base;

/**
 * Created by zhou on 2017/11/6 12:04 .
 */

public class BaseResult<T> {
    public String msg;
    public int status;
    public T data;
}

复制代码

BaseWidget

说明:

package com.zhiup.base.base;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

/**
 * Created by zhou on 2017/11/23 9:39 .
 */

public abstract class BaseWidget extends LinearLayout implements BaseWidgetView{
    private View v;
    public BaseWidget(Context context) {
        this(context,null);
    }

    public BaseWidget(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    protected void init() {
        v = LayoutInflater.from(getContext()).inflate(getLayoutId(),this,true);
        initView();
        initInnerEvent();
    }

    public View getView(){
        return v;
    }
}

复制代码

BaseWidgetView

说明:

package com.zhiup.base.base;

/**
 * Created by zhou on 2017/11/23 9:37 .
 */

public interface BaseWidgetView {
    void initView();
    void initInnerEvent();
    int getLayoutId();
}

复制代码

CommonPagerAdapter

说明:

package com.zhiup.base.base;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

import java.util.List;

public class CommonPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;
    private Fragment mCurrentFragment;

    public CommonPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int arg0) {
        return (fragments == null || fragments.size() == 0) ? null : fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return fragments == null ? 0 : fragments.size();
    }

    /**
     * 使用FragmentPagerAdapter时,难免要在Activity和当前显示的Fragment间传递数据。
     * 但是FragmentPagerAdapter并没有给我们提供类似getCurrentFragment一类的API。
     * 通过FragmentPagerAdapter源码,发现每次Fragment切换都会调用到FragmentPagerAdapter.setPrimaryItem方法。
     * 这个方法里把一个Fragment设置为mCurrentPrimaryItem。很明显mCurrentPrimaryItem就是我们想得到的当前Fragment,
     * 那么我们只需要重载这个方法,把传入的Fragment记录下来即可。
     *
     * @param container
     * @param position
     * @param object
     */
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        mCurrentFragment = (Fragment) object;
        super.setPrimaryItem(container, position, object);
    }

    public Fragment getCurrentFragment() {
        return mCurrentFragment;
    }

}

复制代码

PermissionHandler

说明:

package com.zhiup.base.base;

/**
 * 权限回调接口
 */
public interface PermissionHandler {
    /**
     * 权限通过
     */
    void onGranted();

    /**
     * 权限拒绝
     */
    void onDenied();

    /**
     * 不再询问
     *
     * @return 如果要覆盖原有提示则返回true
     */
    boolean onNeverAsk();
}

复制代码

PermissionUtils

说明:

package com.zhiup.base.base;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.PermissionChecker;
import android.support.v4.util.SimpleArrayMap;

import java.util.ArrayList;

/**
 * 权限工具类,引用PermissionsDispatcher中自带
 * Created by Laiyimin on 2016/8/23.
 */
public final class PermissionUtils {

    // Map of dangerous permissions introduced in later framework versions.
    // Used to conditionally bypass permission-hold checks on older devices.
    private static final SimpleArrayMap<String, Integer> MIN_SDK_PERMISSIONS;

    static {
        MIN_SDK_PERMISSIONS = new SimpleArrayMap<>(8);
        MIN_SDK_PERMISSIONS.put("com.android.voicemail.permission.ADD_VOICEMAIL", 14);
        MIN_SDK_PERMISSIONS.put("android.permission.BODY_SENSORS", 20);
        MIN_SDK_PERMISSIONS.put("android.permission.READ_CALL_LOG", 16);
        MIN_SDK_PERMISSIONS.put("android.permission.READ_EXTERNAL_STORAGE", 16);
        MIN_SDK_PERMISSIONS.put("android.permission.USE_SIP", 9);
        MIN_SDK_PERMISSIONS.put("android.permission.WRITE_CALL_LOG", 16);
        MIN_SDK_PERMISSIONS.put("android.permission.SYSTEM_ALERT_WINDOW", 23);
        MIN_SDK_PERMISSIONS.put("android.permission.WRITE_SETTINGS", 23);
    }

    private static volatile int targetSdkVersion = -1;

    private PermissionUtils() {
    }

    /**
     * Checks all given permissions have been granted.
     *
     * @param grantResults results
     * @return returns true if all permissions have been granted.
     */
    public static boolean verifyPermissions(int... grantResults) {
        if (grantResults.length == 0) {
            return false;
        }
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    /**
     * Returns true if the Activity or Fragment has access to all given permissions.
     *
     * @param context     context
     * @param permissions permission list
     * @return returns true if the Activity or Fragment has access to all given permissions.
     */
    public static String[] hasSelfPermissions(Context context, String... permissions) {
        ArrayList<String> permissionArr = new ArrayList<>();
        for (String permission : permissions) {
            if (permissionExists(permission) && !hasSelfPermission(context, permission)) {
                permissionArr.add(permission);
            }
        }
        return permissionArr.toArray(new String[permissionArr.size()]);
    }

    /**
     * Returns true if the permission exists in this SDK version
     *
     * @param permission permission
     * @return returns true if the permission exists in this SDK version
     */
    private static boolean permissionExists(String permission) {
        // Check if the permission could potentially be missing on this device
        Integer minVersion = MIN_SDK_PERMISSIONS.get(permission);
        // If null was returned from the above call, there is no need for a device API level check for the permission;
        // otherwise, we check if its minimum API level requirement is met
        return minVersion == null || Build.VERSION.SDK_INT >= minVersion;
    }

    /**
     * Determine context has access to the given permission.
     * <p/>
     * This is a workaround for RuntimeException of Parcel#readException.
     * For more detail, check this issue https://github.com/hotchemi/PermissionsDispatcher/issues/107
     *
     * @param context    context
     * @param permission permission
     * @return returns true if context has access to the given permission, false otherwise.
     * @see #hasSelfPermissions(Context, String...)
     */
    private static boolean hasSelfPermission(Context context, String permission) {
        try {
            return PermissionChecker.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
        } catch (RuntimeException t) {
            return false;
        }
    }

    /**
     * Checks given permissions are needed to show rationale.
     *
     * @param activity    activity
     * @param permissions permission list
     * @return returns true if one of the permission is needed to show rationale.
     */
    public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Get target sdk version.
     *
     * @param context context
     * @return target sdk version
     */
    @TargetApi(Build.VERSION_CODES.DONUT)
    public static int getTargetSdkVersion(Context context) {
        try {
            if (targetSdkVersion != -1) {
                return targetSdkVersion;
            }
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return targetSdkVersion;
    }

}

复制代码

转载于:https://juejin.im/post/5b5159306fb9a04fde5ac5aa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值