[轉] android 通過usb讀取 U盤


轉自: https://blog.csdn.net/viking_xhg/article/details/81215297

關聯 compile ‘com.github.mjdev:libaums:+’
權限設置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.hardware.usb.host" android:required="false" /> 
<uses-feature android:name="android.hardware.usb.host" android:required="true" />
監聽u盤 插入拔出的廣播
 //監聽otg插入 拔出
 IntentFilter usbDeviceStateFilter = new IntentFilter();
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
 mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
 //注冊監聽自定義廣播
 IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
 mContext.registerReceiver(UDiskMountedReceiver, filter);
package com.zb.usbtest;

/*
 *  @項目名:  UsbTest 
 *  @包名:    com.zb.usbtest
 *  @文件名:   ReadUDisk
 *  @創建者:   25934
 *  @創建時間:  2018-07-24 13:50
 *  @描述:    TODO
 */

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbManager;
import android.util.Log;
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.partition.Partition;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static com.zb.usbtest.Constant.ACTION_USB_PERMISSION;

public class ReadUDisk {
    private UDiskCallBack.OnUDiskCallBack mOnUDiskCallBack = null;
    private Context                mContext;
    private UsbMassStorageDevice[] storageDevices;
    private List<UsbFile> usbFiles = new ArrayList<>();
    private final UsbManager mUsbManager;

    public ReadUDisk(Context context) {
        mContext = context;
        mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
    }

    /**
     * 接受U盤插入和拔出事件
     * @param onUDiskCallBack
     */
    public void setOnUDiskCallBack(UDiskCallBack.OnUDiskCallBack onUDiskCallBack) {
        if (mOnUDiskCallBack == null) {
            registerReceiver();
            mOnUDiskCallBack = onUDiskCallBack;
        }
    }

    /**
     * 注冊廣播接收者
     */
    public void registerReceiver() {
        //監聽otg插入 拔出
        IntentFilter usbDeviceStateFilter = new IntentFilter();
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
        //注冊監聽自定義廣播
        IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
        mContext.registerReceiver(UDiskMountedReceiver, filter);
        Log.e("ReadUDisk", "registerReceiver: ");
    }

    /**
     * 注銷廣播接收者
     */
    public void unReisterReceiver() {
        if (UDiskMountedReceiver != null) {
            mContext.unregisterReceiver(UDiskMountedReceiver);
        }
    }

    /**
     * 檢查usb設備的權限
     * @param device
     * @return
     */
    public boolean checkPerssion(UsbMassStorageDevice device) {
        if (mUsbManager==null){
            return false;
        }
        if (mUsbManager.hasPermission(device.getUsbDevice())) {//有就直接讀取設備是否有權限
            return true;
        } else {
            return false;
        }
    }


    /**
     * 讀取當前usb設備的數量
     * @return
     */
    public int getDeviceCount() {
        //獲取存儲設備
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        return storageDevices.length;
    }

    /**
     * 根據position獲取usb設備
     * @param position
     * @return
     */
    public UsbMassStorageDevice getUsbMassDevice(int position) {
        //獲取存儲設備
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        if (position > storageDevices.length) {
            return null;
        } else {
            return storageDevices[position];
        }
    }

    /**
     * 獲取usb上所有的存儲設備
     * @return
     */
    public UsbMassStorageDevice[] getUsbMassAllDevice() {
        //獲取存儲設備
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        return storageDevices;
    }

    /**
     * 根據設備獲取路徑
     * @param device
     * @return
     */
    public FileSystem readDevice(UsbMassStorageDevice device) {
        try {
            if (!checkPerssion(device)){  //檢查是否有權限
                return null;
            }

            device.init();//使用設備之前需要進行 初始化
            Partition  partition = device.getPartitions().get(0); //僅使用設備的第一個分區
            FileSystem currentFs = partition.getFileSystem();
            // currentFs.getCapacity(); //容量大小
            // currentFs.getOccupiedSpace(); //已使用大小
            // currentFs.getFreeSpace();  //未使用的大小
            UsbFile root       = currentFs.getRootDirectory();//獲取根目錄
            String  deviceName = currentFs.getVolumeLabel();//獲取設備標簽
            return currentFs;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 獲取U盤的文件和文件夾路徑
     * @param fileSystem
     * @return
     */
    public List<UsbFile> getUsbFiles(FileSystem fileSystem) {
        usbFiles.clear();
        try {
            for (UsbFile file : fileSystem.getRootDirectory()
                                          .listFiles()) {  //將所以文件和文件夾路徑添加到usbFiles數組中
                usbFiles.add(file);
            }
            Collections.sort(usbFiles, new Comparator<UsbFile>() {//簡單排序 文件夾在前 文件在后
                @Override
                public int compare(UsbFile oFile1, UsbFile oFile2) {
                    return oFile1.isDirectory()
                           ? -1
                           : 1;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        return usbFiles;
    }


    private BroadcastReceiver UDiskMountedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            switch (action) {
                case ACTION_USB_PERMISSION: //自定義權限廣播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onPermissionCallBack();
                    }
                    break;
                case UsbManager.ACTION_USB_DEVICE_ATTACHED: //usb設備插入廣播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onAttachDeviceCallBack();
                    }
                    break;

                case UsbManager.ACTION_USB_DEVICE_DETACHED: //usb設備拔出廣播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onDetachDeviceCallBack();
                    }
                    break;
            }
        }
    };
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM