# IO
**Repository Path**: relin/IO
## Basic Information
- **Project Name**: IO
- **Description**: Anroid IO
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-09-23
- **Last Updated**: 2023-09-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#### IO
Android文件操作工具,Android11以后强制采用沙河模式,不再支持传统存储模式,工具采用沙盒安全模式,不要设置传统存储模式.
文件下载
异常记录
文本读写
内含三方PhotoView
系统+自定义相机拍照、录像
文件打开预览(支持图片集合)
自定义进度圆圈CircleProgress
内含腾讯Bugly、TBS、ISOParser
数据(DataStore - SharedPreferences)
系统+自定义媒体文件选择,音频文件专辑图片兼容高版本。
#### 资源
|名字|资源|
|-|-|
|AAR|[下载](https://github.com/RelinRan/IO/blob/main/aar)|
|GitHub |[查看](https://github.com/RelinRan/IO)|
|Gitee|[查看](https://gitee.com/relin/IO)|
#### Maven
1.build.grade
```
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
```
2./app/build.grade
```
dependencies {
implementation 'com.github.RelinRan:IO:2023.9.25.1'
}
```
#### 初始化
初始化腾讯TBS、Bugly(appId是腾讯平台ID),如果不用Bugly设置appId为空。
```
TBS.initialize(applicationContext,appId);
```
配置权限
```
```
配置res/xml/path.xml
```
```
配置AndroidManifest.xml
```
```
#### 预览
图片加载器
```
TBS tbs = TBS.initialize(applicationContext,appId);
//注意:只针对IO工具内部的相册页面有效
tbs.imageLoader((target, url) -> {
//tatget:图片view, url是图片资源路径,主要考虑到用户使用的图片加载工具不一致。
//TODO Glide等工具加载图片
});
```
本地文件
```
TBSActivity.start(activity,file);
```
网络文件
```
//单文件
TBSActivity.start(activity,"http://xxx.xxx.xxx.png",override);//override:是否覆盖原下载文件
//多文件预览
List urls = new Array<>();
urls.add("xxxx");
int position = 0;
TBSActivity.start(activity, urls, position);
```
#### 下载
```
Downloader downloader = new Downloader(this, url);
downloader.setOverride(false);
downloader.setOnDownloadListener(new OnDownloadListener() {
@Override
public void onDownloading(long total, long progress) {
}
@Override
public void onDownloadCompleted(File file) {
}
@Override
public void onDownloadFailed(Exception e) {
}
});
downloader.start();
```
#### 选择
系统选择
```
MediaProvider mediaProvider = new MediaProvider(activity);
mediaProvider.pick("image/*");//视频:video/* 图片:image/*
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mediaProvider.onActivityResult(requestCode, resultCode, data, (request_code, file) -> {
//TODO:file为结果
});
}
```
定义选择
```
MediaActivity.start(this, Media.IMAGE, false, true, MediaActivity.UNLIMITED)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == MediaActivity.REQUEST_CODE) {
ArrayList medias = MediaActivity.getResult(data);
}
}
```
#### 拍照
系统拍照
```
MediaProvider mediaProvider = new MediaProvider(activity);
mediaProvider.capture();
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mediaProvider.onActivityResult(requestCode, resultCode, data, (request_code, file) -> {
//TODO:file为结果
});
}
```
定义拍照
```
CameraActivity.start(this,new CameraOptions(true));
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == CameraActivity.REQUEST_CODE) {
File file = CameraActivity.getFile(this,data);
}
}
```
#### 图片
是否是图片
```
ImageProvider.isBitmap(File file);
```
是否可压缩
```
ImageProvider.isCompressible(String path);
```
创建文件名
```
ImageProvider.createName(prefix,suffix);
```
创建文件
```
ImageProvider.createCacheFile(context,dirName,suffix);
```
缓存文件夹
```
File dir = ImageProvider.getCacheDir(Context context, String name);//name:ImageProvider.DIRECTORY_PICTURES
```
清除文件
```
ImageProvider.clear(context,ImageProvider.DIRECTORY_COMPRESS);
ImageProvider.clear(context,ImageProvider.DIRECTORY_CROP);
ImageProvider.clear(context,ImageProvider.DIRECTORY_PICTURES);
```
纠正角度
```
ImageProvider.correct(path);
```
压缩文件
```
ImageProvider.compress(Bitmap bitmap, long max, Bitmap.CompressFormat format);
```
转文件
```
ImageProvider.toFile(Bitmap bitmap, String path);
```
按大小解析图片
```
ImageProvider.decodePath(String path, int width, int height);
```
Uri转Bitmap
```
Bitmap bitmap = ImageProvider.decodeUri(Context context, Uri uri);
```
图片缩放参数
```
BitmapFactory.Options options = ImageProvider.inSampleSize(String path, int width, int height);
```
文件转base64
```
String base64 = ImageProvider.encodeBase64(File file, boolean encode);//encode:是否URLEncoder
```
Base64转File
```
File file = ImageProvider.decodeBase64(String base64, String path, boolean decode);//encode:是否URLEncoder
```
图片缩略图
```
Bitmap bitmap = ImageProvider.createImageThumbnail(String path, int width, int height);//encode:是否URLEncoder
```
#### 录像
系统录像
```
VideoProvider videoProvider = new VideoProvider(this);
videoProvider.record();
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
videoProvider.onActivityResult(requestCode, resultCode, data, (request_code, file) -> {
//TODO:file为结果
});
}
```
定义录像
```
CameraActivity.start(this,new CameraOptions(false));
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == CameraActivity.REQUEST_CODE) {
File file = CameraActivity.getFile(this,data);
}
}
```
#### 缓存
添加
```
DataStore.put(context,key,value);
```
获取
```
DataStore.getString(context,key,defValue)
```
#### 文件
获取外部缓存目录
```
IOProvider.getCacheDir(Context context);
```
获取应用外部文件夹
```
IOProvider.getFilesDir(Context context, String name);
```
创建新文件夹
```
IOProvider.makeFilesDir(Context context, String name);
```
创建新缓存文件夹
```
IOProvider.makeCacheDir(Context context, String name);
```
创建文件
```
IOProvider.createFile(Context context, String dirName, String fileName);
```
复制文件
```
IOProvider.copy(File from, File to);
```
删除文件
```
IOProvider.deleteDir(File file);
```
文件大小
```
IOProvider.length(file,IOProvider.UNIT_KB);
```
文件大小名称
```
IOProvider.lengthName(File file);
```
获取文件后缀
```
IOProvider.getSuffix(String path);
```
获取文件类型
```
IOProvider.getMimeType(String path);
```
获取Assets文件内容
```
IOProvider.readAssets(Context context, String fileName);
```
读取文件
```
IOProvider.read(File file);
```
写入文件内容
```
IOProvider.write(Context context, String fileName, String content);
```
文件流转File
```
IOProvider.decodeInputStream(InputStream inputStream, String path);
```
File转Bytes
```
byte[] bytes = IOProvider.decodeFile(File file);
```
Bytes转File
```
File file = IOProvider.decodeBytes(byte[] bytes, String path);
```
通过文件名获取资源id
```
int resId = IOProvider.findResId(String variableName, Class> cls);//例子:getResId("icon", R.drawable.class);
```
#### 文本
写入
```
Writer writer = new Writer("/storage/emulated/0/1.txt");
//同步写入
writer.sync("content",false);
//异步写入
writer.async("content", false, new OnWriteListener() {
@Override
public void onWrite(String content) {
}
});
```
读取
```
Reader reader = new Reader("/storage/emulated/0/1.txt");
//同步读取
String content = reader.sync();
//异步读取
reader.async(new OnReadListener() {
@Override
public void onRead(String content) {
}
});
```
TextFile
```
TextFile text = new TextFile("Your Project Name","Text Dir","log");
//写入内容
text.write("text content");
//读取内容
String content = text.read();
```
#### 异常
异常捕捉
```
//注意:使用这个类需要提前申请文件写入、读取权限,在Android 6.0需要动态申请权限
CrashLog log = CrashLog.initialize(context);//初始化
log.setBugly("Bugly APP ID");//腾讯Bugly APP ID
log.setFolder("YourProjectName","Crash");//文件夹
log.setSuffix("crash");//文件前缀
log.setTimeUnit(TimeUnit.HOURS);//时间单位
log.setInitialDelay(0);//定时任务第一次延迟时间
log.setExp(7*24);//文件过期时间
log.setPeriod(4);//检查频率
log.startScheduled();//开启定时任务
//#destory
log.cancel();//取消所有任务操作
```
#### Apk
获取应用名称
```
String name = Apk.getApplicationName(context);
```
版本名字
```
String version = Apk.getVersionName(context);
```
版本代码
```
int code = Apk.getVersionCode(context);
```
比较版本号是否需要升级
```
boolean isUpgrade = Apk.isUpgrade(context,"1.0.1");
```
普通安装apk
```
Apk.install(Context context, String path);
```
自动点击确认安装
```
Apk.installPackage(Activity activity, String path, String authority, int requestCode);
```
获取apk包名
```
Apk.getPackageName(Context context, String path);
```
获取启动类组件名称
```
Apk.getLauncherComponentName(Context context);
```
#### Shell
重启设备
```
Shell.reboot(context);
```
是否拥有Root权限
```
Shell.isRooted();
```
命令安装(Root权限)
```
Shell.install(Context context, String path, OnExecuteListener listener);
```
执行命令
```
Shell.execute(int type, String[] commands, OnExecuteListener listener);
```
#### 视频
创建缓存文件
```
VideoProvider.createFile(Context context, String dirName, String fileName);
```
拷贝文件
```
VideoProvider.copy(Uri from, File to);
```
删除文件
```
VideoProvider.delete(Uri uri);
```
查询名称
```
String displayName = VideoProvider.queryDisplayName(Uri uri);
```
缩略图
```
Bitmap bitmap = VideoProvider.loadThumbnail(Context context, Uri uri, int width, int height);
```
创建视频缩略图
```
Bitmap bitmap = VideoProvider.createVideoThumbnail(String path, int width, int height);
```
查询ID
```
long id = VideoProvider.queryId(Uri uri);
```
Uri转File
```
File file = VideoProvider.transfer(Context context, Uri uri, String fileName);
```
提炼宽高
```
int[] wh = VideoProvider.extractSize(Context context, File file);
```
提炼时长
```
long duration = VideoProvider.extractDuration(Context context, Uri uri);
```
查询视频集合
```
List