整理下项目中遇到的轮子,后面做的时候直接方便移植
权限管理工具类
/**
* 权限管理
*/
public class PermissionsUtils {
private final int mRequestCode = 101;// 权限请求码
/**
* 是否需要去系统设置中
*/
private boolean showSystemSetting = true;
/**
* 不再提示权限时的展示对话框
*/
private AlertDialog mPermissionDialog;
private PermissionsUtils() {
}
private static PermissionsUtils permissionsUtils;
private ApplyResult mPermissionsResult;
public static PermissionsUtils getInstance() {
if (permissionsUtils == null) {
permissionsUtils = new PermissionsUtils();
}
return permissionsUtils;
}
/**
* 检查权限
* @param context 上下文
* @param permissions 权限s
* @param permissionsResult 返回接口
*/
public void checkPermissions(Activity context, String[] permissions, @NonNull ApplyResult permissionsResult) {
mPermissionsResult = permissionsResult;
if (context == null || permissions == null) {
return;
}
// 6.0才用动态权限
if (Build.VERSION.SDK_INT < 23) {
permissionsResult.onSuccess();
return;
}
// 创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList中
List<String> mPermissionList = new ArrayList<>();
// 逐个判断你要的权限是否已经通过
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permission);// 添加还未授予的权限
}
}
// 申请权限
if (mPermissionList.size() > 0) {// 有权限没有通过,需要申请
ActivityCompat.requestPermissions(context, permissions, mRequestCode);
} else {
// 说明权限都已经通过
permissionsResult.onSuccess();
}
}
/**
* 请求权限后回调的方法
* @param context 上下文
* @param requestCode 是我们自己定义的权限请求码
* @param permissions 是我们请求的权限名称数组
* @param grantResults 是我们在弹出页面后是否允许权限的标识数组
*/
public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (context == null) {
return;
}
boolean hasPermissionDismiss = false;// 有权限没有通过
if (mRequestCode == requestCode) {
for (int grantResult : grantResults) {
if (grantResult == -1) {
hasPermissionDismiss = true;
}
}
// 如果有权限没有被允许
if (hasPermissionDismiss) {
if (showSystemSetting) {
// 跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
showSystemPermissionsSettingDialog(context);
} else {
mPermissionsResult.onFailed();
}
} else {
// 全部权限通过
mPermissionsResult.onSuccess();
}
}
}
private void showSystemPermissionsSettingDialog(final Activity context) {
if (context == null) {
return;
}
final String mPackName = context.getPackageName();
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(context).setMessage("请去设置中手动授予权限")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
Uri packageURI = Uri.parse("package:" + mPackName);
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
context.startActivity(intent);
context.finish();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 关闭页面或者做其他操作
cancelPermissionDialog();
// mContext.finish();
mPermissionsResult.onFailed();
}
}).create();
}
mPermissionDialog.show();
}
private void cancelPermissionDialog() {
if (mPermissionDialog != null) {
mPermissionDialog.cancel();
mPermissionDialog = null;
}
}
/**
* 申请结果返回
*/
public interface ApplyResult {
/**
* 成功
*/
void onSuccess();
/**
* 失败
*/
void onFailed();
}
}
使用截图
从assets目录中拷贝到手机存储中
/**
* 单例文件管理,完成拷贝后提供回调
*/
public class FileManager {
private static FileManager instance;
private static final int SUCCESS = 1;
private static final int FAILED = 0;
private Context context;
private FileCopyCallback callback;
private volatile boolean isSuccess;
private String errorStr;
public static FileManager getInstance(Context context) {
if (instance == null) {
instance = new FileManager(context);
}
return instance;
}
private FileManager(Context context) {
this.context = context;
}
/**
* 主线程通知handler
*/
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (callback != null) {
if (msg.what == SUCCESS) {
callback.onSuccess();
}
if (msg.what == FAILED) {
callback.onFailed(msg.obj.toString());
}
}
}
};
/**
* 拷贝assets到sd卡
* @param srcPath 文件路径
* @param sdPath sd卡路径
* @return FileManager
*/
public FileManager copyAssetsToSD(final String srcPath, final String sdPath) {
new Thread(new Runnable() {
@Override
public void run() {
copyAssetsToDst(context, srcPath, sdPath);
if (isSuccess)
handler.obtainMessage(SUCCESS).sendToTarget();
else
handler.obtainMessage(FAILED, errorStr).sendToTarget();
}
}).start();
return this;
}
/**
* 设置接口返回
* @param callback callback
*/
public void setFileOperateCallback(FileCopyCallback callback) {
this.callback = callback;
}
private void copyAssetsToDst(Context context, String srcPath, String dstPath) {
try {
String fileNames[] = context.getAssets().list(srcPath);
if (fileNames.length > 0) {
File file = new File(Environment.getExternalStorageDirectory(), dstPath);
if (!file.exists()) {
file.mkdirs();
} else {
file.delete();
}
for (String fileName : fileNames) {
if (!srcPath.equals("")) { // assets 文件夹下的目录
copyAssetsToDst(context, srcPath + File.separator + fileName,
dstPath + File.separator + fileName);
} else { // assets 文件夹
copyAssetsToDst(context, fileName, dstPath + File.separator + fileName);
}
}
} else {
File outFile = new File(Environment.getExternalStorageDirectory(), dstPath);
InputStream is = context.getAssets().open(srcPath);
FileOutputStream fos = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int byteCount;
while ((byteCount = is.read(buffer)) != -1) {
fos.write(buffer, 0, byteCount);
}
fos.flush();
is.close();
fos.close();
}
isSuccess = true;
} catch (Exception e) {
e.printStackTrace();
errorStr = e.getMessage();
isSuccess = false;
}
}
public interface FileCopyCallback {
void onSuccess();
void onFailed(String error);
}
}
使用截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNsvKY62-1587608512705)(C:\Users\86130\Desktop\copy工具.png)]
e.printStackTrace();
errorStr = e.getMessage();
isSuccess = false;
}
}
public interface FileCopyCallback {
void onSuccess();
void onFailed(String error);
}
}
使用截图
