整理下項目中遇到的輪子,後面做的時候直接方便移植
權限管理工具類
/**
* 權限管理
*/
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);
}
}
使用截圖
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200423102512254.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pLaGVybw==,size_16,color_FFFFFF,t_70)