Android U盘读写要用到的三方库:https://github.com/magnusja/libaums,使用方法地那就链接了解。
最近项目需要用到OTG功能,写了一个小demo,做为自己的笔记也供大家参考。
需要用到的权限:

USB插拔广播
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.util.Log;
import com.example.usbreadwriterdaemon.MainActivity;
import com.example.usbreadwriterdaemon.utils.ToastUtil;
import org.greenrobot.eventbus.EventBus;
/**
* Created by sws on 2018/8/28
* <p>
* USB插拔广播
*/
public class UsbStateChangeReceiver extends BroadcastReceiver {
private static final String TAG = "UsbStateChangeReceiver";
private boolean isConnected;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
isConnected = true;
ToastUtil.showToast("onReceive: USB设备已连接");
UsbDevice device_add = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device_add != null) {
EventBus.getDefault().post(new UsbStatusChangeEvent(isConnected));
} else {
ToastUtil.showToast("onReceive: device is null");
}
} else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
//Log.i(TAG, "onReceive: USB设备已分离");
isConnected = false;
ToastUtil.showToast("onReceive: USB设备已拔出");
EventBus.getDefault().post(new UsbStatusChangeEvent(isConnected));
} else if (action.equals(MainActivity.ACTION_USB_PERMISSION)) {
UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
//允许权限申请
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (usbDevice != null) {
Log.i(TAG, "onReceive: 权限已获取");
EventBus.getDefault().post(new UsbStatusChangeEvent(true, usbDevice));
} else {
ToastUtil.showToast("没有插入U盘");
}
} else {
ToastUtil.showToast("未获取到U盘权限");
}
} else {
//Log.i(TAG, "onReceive: action=" + action);
ToastUtil.showToast("action= " + action);
}
}
}
USB状态类,结合EventBus使用
import android.hardware.usb.UsbDevice;
/**
* Created by swson 2018/8/28
* <p>
* Description:TODO
*/
public class UsbStatusChangeEvent {
public boolean isConnected = false;
public boolean isGetPermission = false;
public UsbDevice usbDevice;
public String filePath = "";
public UsbStatusChangeEvent(boolean isConnected) {
this.isConnected = isConnected;
}
public UsbStatusChangeEvent(String filePath) {
this.filePath = filePath;
}
public UsbStatusChangeEvent(boolean isGetPermission, UsbDevice usbDevice) {
this.isGetPermission = isGetPermission;
this.usbDevice = usbDevice;
}
}
app gradle添加依赖:
implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'org.greenrobot:eventbus:3.0.0' implementation 'com.github.mjdev:libaums:0.5.5'
文件操作工具类FileUtil:
import android.os.Environment; import com.github.mjdev.libaums.fs.UsbFile; import com.github.mjdev.libaums.fs.UsbFileOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import static android.os.Environment.getExternalStorageDirectory; /** * Created by sws on 2018/8/28 * 文件操作工具类 * Description:TODO */ public final class FileUtil { public static final String DEFAULT_BIN_DIR = "usb"; /** * 检测SD卡是否存在 */ public static boolean checkSDcard() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } /** * 从指定文件夹获取文件 * * @return 如果文件不存在则创建, 如果如果无法创建文件或文件名为空则返回null */ public static File getSaveFile(String folderPath, String fileNmae) { File file = new File(getSavePath(folderPath) + File.separator + fileNmae); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return file; } /** * 获取SD卡下指定文件夹的绝对路径 * * @return 返回SD卡下的指定文件夹的绝对路径 */ public static String getSavePath(String folderName) { return getSaveFolder(folderName).getAbsolutePath(); } /** * 获取文件夹对象 * * @return 返回SD卡下的指定文件夹对象,若文件夹不存在则创建 */ public static File getSaveFolder(String folderName) { File file = new File(getExternalStorageDirectory() .getAbsoluteFile() + File.separator + folderName + File.separator); file.mkdirs(); return file; } /** * 关闭流 */ public static void closeIO(Closeable... closeables) { if (null == closeables || closeables.length <= 0) { return; } for (Closeable cb : closeables) { try { if (null == cb) { continue; } cb.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void redFileStream(OutputStream os, InputStream is) throws IOException { int bytesRead = 0; byte[] buffer = new byte[1024 * 8]; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } os.flush(); os.close(); is.close(); } /** * @description 把本地文件写入到U盘中 * @author ldm * @time 2017/8/22 10:22 */ public static void saveSDFile2OTG(final File f, final UsbFile usbFile) { UsbFile uFile = null; FileInputStream fis = null; try {//开始写入 fis = new FileInputStream(f);//读取选择的文件的 if (usbFile.isDirectory()) {//如果选择是个文件夹 UsbFile[] usbFiles = usbFile.listFiles(); if (usbFiles != null && usbFiles.length > 0) { for (UsbFile file : usbFiles) { if (file.getName().equals(f.getName())) { file.delete(); } } } uFile = usbFile.createFile(f.getName()); UsbFileOutputStream uos = new UsbFileOutputStream(uFile); try { redFileStream(uos, fis); } catch (IOException e) { e.printStackTrace(); } } } catch (final Exception e) { e.printStackTrace(); } } }
主页--U盘的读取写入
import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.usbreadwriterdaemon.receiver.UsbStateChangeReceiver;
import com.example.usbreadwriterdaemon.receiver.UsbStatusChangeEvent;
import com.example.usbreadwriterdaemon.utils.FileUtil;
import com.example.usbreadwriterdaemon.utils.ToastUtil;
import com.github.mjdev.libaums.UsbMassStorageDevice;
import com.github.mjdev.libaums.fs.FileSystem;
import com.github.mjdev.libaums.fs.UsbFile;
import com.github.mjdev.libaums.fs.UsbFileInputStream;
import com.github.mjdev.libaums.partition.Partition;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.u_disk_edt)
EditText mUDiskEdt;
@BindView(R.id.u_disk_write)
Button mUDiskWrite;
@BindView(R.id.u_disk_read)
Button mUDiskRead;
@BindView(R.id.u_disk_show)
TextView mUDiskShow;
private UsbMassStorageDevice[] storageDevices;
private UsbFile cFolder;
//自定义U盘读写权限
public static final String ACTION_USB_PERMISSION = "com.example.usbreadwriterdaemon.USB_PERMISSION";
private final static String U_DISK_FILE_NAME = "taiyuan.doc";
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 100:
ToastUtil.showToast("保存成功");
break;
case 101:
String txt = msg.obj.toString();
if (!TextUtils.isEmpty(txt))
mUDiskShow.setText("读取到的数据是:" + txt);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_method_one);
ButterKnife.bind(this);
EventBus.getDefault().register(this);
registerUDiskReceiver();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetworkChangeEvent(UsbStatusChangeEvent event) {
if (event.isConnected) {
//接收到U盘插入广播,尝试读取U盘设备数据
redUDiskDevsList();
} else if (event.isGetPermission) {
UsbDevice usbDevice = event.usbDevice;
//用户已授权,可以进行读取操作
Log.i(TAG, "onNetworkChangeEvent: ");
ToastUtil.showToast("onReceive: 权限已获取");
readDevice(getUsbMass(usbDevice));
} else {
}
}
@OnClick({R.id.u_disk_write, R.id.u_disk_read})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.u_disk_write:
final String content = mUDiskEdt.getText().toString().trim();
mHandler.post(new Runnable() {
@Override
public void run() {
saveText2UDisk(content);
}
});
break;
case R.id.u_disk_read:
readFromUDisk();
break;
}
}
/**
* @description 保存数据到U盘,目前是保存到根目录的
* @author ldm
* @time 2017/9/1 17:17
*/
private void saveText2UDisk(String content) {
//项目中也把文件保存在了SD卡,其实可以直接把文本读取到U盘指定文件
File file = FileUtil.getSaveFile(getPackageName() + File.separator + FileUtil.DEFAULT_BIN_DIR, U_DISK_FILE_NAME);
try {
FileWriter fw = new FileWriter(file);
fw.write(content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
if (null != cFolder) {
FileUtil.saveSDFile2OTG(file, cFolder);
mHandler.sendEmptyMessage(100);
}
}
StringBuffer stringBuffer = new StringBuffer();
private void readFromUDisk() {
UsbFile[] usbFiles = new UsbFile[0];
try {
usbFiles = cFolder.listFiles();
} catch (IOException e) {
e.printStackTrace();
}
if (null != usbFiles && usbFiles.length > 0) {
for (UsbFile usbFile : usbFiles) {
stringBuffer.append(", " + usbFile.getName());
if (usbFile.getName().equals(U_DISK_FILE_NAME)) {
readTxtFromUDisk(usbFile);
}
}
//mUDiskShow.setText("文件名:" + stringBuffer.toString());
}
}
/**
* @description U盘设备读取
* @author ldm
* @time 2017/9/1 17:20
*/
private void redUDiskDevsList() {
//设备管理器
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
//获取U盘存储设备
storageDevices = UsbMassStorageDevice.getMassStorageDevices(this);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
//一般手机只有1个OTG插口
for (UsbMassStorageDevice device : storageDevices) {
//读取设备是否有权限
if (usbManager.hasPermission(device.getUsbDevice())) {
ToastUtil.showToast("有权限");
readDevice(device);
} else {
ToastUtil.showToast("没有权限,进行申请");
//没有权限,进行申请
usbManager.requestPermission(device.getUsbDevice(), pendingIntent);
}
}
if (storageDevices.length == 0) {
ToastUtil.showToast("请插入可用的U盘");
}
}
private UsbMassStorageDevice getUsbMass(UsbDevice usbDevice) {
for (UsbMassStorageDevice device : storageDevices) {
if (usbDevice.equals(device.getUsbDevice())) {
return device;
}
}
return null;
}
private void readDevice(UsbMassStorageDevice device) {
try {
device.init();//初始化
//设备分区
Partition partition = device.getPartitions().get(0);
//文件系统
FileSystem currentFs = partition.getFileSystem();
currentFs.getVolumeLabel();//可以获取到设备的标识
//通过FileSystem可以获取当前U盘的一些存储信息,包括剩余空间大小,容量等等
Log.e("Capacity: ", currentFs.getCapacity() + "");
Log.e("Occupied Space: ", currentFs.getOccupiedSpace() + "");
Log.e("Free Space: ", currentFs.getFreeSpace() + "");
Log.e("Chunk size: ", currentFs.getChunkSize() + "");
ToastUtil.showToast("可用空间:" + currentFs.getFreeSpace());
cFolder = currentFs.getRootDirectory();//设置当前文件对象为根目录
} catch (Exception e) {
e.printStackTrace();
}
}
private void readTxtFromUDisk(UsbFile usbFile) {
Log.i(TAG, "readTxtFromUDisk: ");
UsbFile descFile = usbFile;
//读取文件内容
InputStream is = new UsbFileInputStream(descFile);
//读取秘钥中的数据进行匹配
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(is));
String read;
while ((read = bufferedReader.readLine()) != null) {
sb.append(read);
}
Message msg = mHandler.obtainMessage();
msg.what = 101;
msg.obj = sb;
mHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* usb插拔广播 注册
*/
private void registerUDiskReceiver() {
IntentFilter usbDeviceStateFilter = new IntentFilter();
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
usbDeviceStateFilter.addAction("android.hardware.usb.action.USB_STATE");
usbDeviceStateFilter.addAction(ACTION_USB_PERMISSION); //自定义广播
registerReceiver(new UsbStateChangeReceiver(), usbDeviceStateFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
}
最后
以上就是怡然斑马最近收集整理的关于Android OTG U盘文件读写的全部内容,更多相关Android内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复