Activity
说明: Activity基类
- 让子类方便的获取tag
- 让子类方便的getActvity
- 默认设置竖屏锁定
- 模版方法模式让子类可以方便的进行数据填充代码编写
- findView让子类省去findViewByid的强转,更方便的获取xml组件
- 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;
}
}
复制代码