Android 机顶盒中获取U盘的卷标

最近,在开发Android 机顶盒中,遇到需要打印U盘的卷标问题。通过查阅资料,记录一下学习过程。

卷标,用通俗的话来说,就是U盘的名称

如图:在windows系统中,F:为盘符

           MQUDISK为U盘名称,也是卷标。

在Linux系统中,一般只会显示U盘的挂载路径,并没有显示盘符。

在Android开发中,如果需要显示U盘的名称,则需要额外写代码获取。


在代码中的体现:


private StorageManager mStorageManager;

在onCreate()方法中,添加系统权限

mStorageManager = (StorageManager)getSystemService(Context.STORAGE_SERVICE);


关键方法:通过反射的方法(具体原理,我也不清楚,原谅我还是小白)

public class UsbReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "intent  " + intent);
if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) {
//external storage
                Class<?> volumeInfoClazz = null;
                Method getDescriptionComparator = null;
                Method getBestVolumeDescription = null;
                Method getVolumes = null;
                Method isMountedReadable = null;
                Method getType = null;
                Method getPath = null;
                List<?> volumes = null;
                try {
                    volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");
                    getDescriptionComparator = volumeInfoClazz.getMethod("getDescriptionComparator");
                    getBestVolumeDescription = StorageManager.class.getMethod("getBestVolumeDescription", volumeInfoClazz);
                    getVolumes = StorageManager.class.getMethod("getVolumes");
                    isMountedReadable = volumeInfoClazz.getMethod("isMountedReadable");
                    getType = volumeInfoClazz.getMethod("getType");
                    getPath = volumeInfoClazz.getMethod("getPath");
                    volumes = (List<?>)getVolumes.invoke(mStorageManager);

                    for (Object vol : volumes) {
                        if (vol != null && (boolean)isMountedReadable.invoke(vol) && (int)getType.invoke(vol) == 0) {
                            File path2 = (File)getPath.invoke(vol);
                            String p1 = (String)getBestVolumeDescription.invoke(mStorageManager, vol);
                            String p2 = path2.getPath();
                            Log.d(TAG,"-----------path2-----------------"+p1);                             //打印U盘卷标名称
                            Log.d(TAG,"-----------path2 @@@@@-----------------"+p2);         //打印U盘路径
                        }
                    }
                }catch (Exception ex) {
                    ex.printStackTrace();
                }

   }

}


在此,我还有一个疑问,当前打印出来的U盘名称(如果含有汉字)则为乱码,不知道该怎么解决?

麻烦有知道解决方法的告知一下,谢谢~


在C语言,要获取磁盘卷标名称,可以使用以下步骤: 1. 首先,需要包含Windows.h头文件,这个头文件定义了一些用于Windows系统编程的函数和数据结构。 2. 使用GetVolumeInformation函数来获取磁盘卷标名称。该函数的原型如下: BOOL GetVolumeInformationA( LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize ); 其,lpRootPathName是一个指向包含卷标的根路径的字符串,比如"C:\";lpVolumeNameBuffer是用来存放卷标名称的缓冲区;nVolumeNameSize是缓冲区大小;其他的参数可以传入NULL。 3. 创建一个字符数组,用来存储卷标名称。 4. 调用GetVolumeInformation函数,并传入磁盘根路径和字符数组作为参数。 5. 如果函数返回TRUE,表示获取卷标名称成功,可以通过打印字符数组的值来查看卷标名称。 以下是一个示例代码: ```c #include <Windows.h> #include <stdio.h> int main() { char volumeName[MAX_PATH]; char rootPath[] = "C:\\"; if (GetVolumeInformationA(rootPath, volumeName, sizeof(volumeName), NULL, NULL, NULL, NULL, 0)) { printf("磁盘卷标名称: %s\n", volumeName); } else { printf("无法获取磁盘卷标名称\n"); } return 0; } ``` 以上是用C语言获取磁盘卷标名称的方法。注意,在Windows系统上,不是所有的磁盘都会有卷标名称,所以有可能获取到的名称为空。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值