先介绍下整个环境:
硬件是android盒子: 
系统是Andorid 5.1.1,这些都是厂家定制的。
屏幕就是用一个电脑的显示器用接口然后和盒子接起来。
(ps:本人作为稍微得道的一枚小白,要像大佬学习的地方还很多,所以能提供的信息我都提供下,希望各位大佬能够为我答疑解惑下,或者各位同仁一起探讨学习)接下来是正文:
原需求:保存文件至SD卡上(这个简单,也实现了)。新需求:现在就是加一个 在保存文件时候判断是否有U盘,有的话,往U盘里也保存一份(就像上面那图一样,这个android盒子是能接U盘的,我也不清楚这个是否和手机OTG连U盘是一个性质。)我做了哪些事情:
1.刚拿到需求的时候还觉得很简单,不就是多写个路径保存下嘛。
  先去系统自带的文件管理器里查看了U盘的路径
    于是就:
    private String USB="/mnt/usbdisk";
    private boolean saveDrawToFile(Bitmap bitmap, String fileName) {
        File dir = new File(USB);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dir, fileName);
        return FileWriter.writeBitmap(file, bitmap);
       //writeBitmap-------->向指定文件写入bitmap
    }
结果:不用想失败了。2.上面的方法失败后,我就想或许是我把这个想的太简单了,有没可能是路径的问题,而导致写入失败?
   于是就:
  (各种百度:如何获取U盘的、外置存储的路径)
   其中就参考了这篇文章:http://blog.csdn.net/u014587769/article/details/52072608
   获取到了所有的挂载点信息(ps:第一次知道了这个词:挂载,虽然貌似到现在还是不太懂啥含义)
   我就把获取到的所有挂载点信息的地址都取了出来
   得到: /storage/emulated/0
/storage/sdcard1
/storage/usbdisk
/storage/usbdisk2
/storage/usbdisk3
/storage/usbdisk4
  疑问就又来了(小白真是走一步一个坎坷吖),为什么用系统的文件管理器看地址是/mnt/usbdisk 而这里获取的却是/storage/usbdisk,mnt和storage什么区别呢? 又上网查了一通,大概有点了解了,然后以为希望来了,心想上面肯定有一个地址就是U盘的了,就把上面的地址都试了一遍
  结果:还是失败了3.后来又想会不会是其实地址是正确了,只是写入不成功呢?
为了印证这个想法我就先去读了下U盘的其中一个文件,看看是否能读的到 是不是返回true
    public boolean fileIsExists(String path){
        try{
            File f=new File(path);
            if(!f.exists()){
                return false;
            }
        
        }catch (Exception e) {
            // TODO: handle exception
            return false;
        }
        return true;
    }
Toast.makeText(ContextHolder.getContext(),"文件是否存在--------->"+fileIsExists(USB+File.separator+"copy.bat"),Toast.LENGTH_LONG).show();
   结果:显示文件是存在的,说明说 /storage/usbdisk  这个地址是正确的。4.感觉离问题的原因越来越近了,最有可能的问题就是没有写入权限!!
一开始我以为是不是AndroidMainfest.xml中漏加了什么权限?只要加上后就行。上网查了后 <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>也把这个权限加上了还是不行
后边我就查:(有关U盘的写入权限问题),但是网上的方法貌似如出一辙,修改什么system\etc\permissions\platform.xml 文件啊,修改framework里什么啊,也有说到RE管理器去修改什么啊(ps:难道说要每个安装这个app的用户都得到里面去做这些事吗。。这让我很不解)虽然到现在我连这些文件在哪都不知道0.0但是我感觉这些都不是答案,其中也参考了这篇文章也是遇到了相关的问题http://bbs.csdn.net/topics/3902591215.后来再RE管理器里找到U盘得位置,创建了个文件夹显示创建失败,进一步印证了是没有写入权限得问题。RE管理器是提示没有root权限,后来又返回来又想了想系统自带得文件管理器,我在里面都是可以创建文件夹,删除东西啥操作得。就又去查了如何为单个app增加root权限,也是各种偏底层得方法。(作为小白看这些却是会有点吃力0.0)好了。上面写了那么多,总结下来问题就是:我遇到得这个问题是不是就是没有写入权限导致得?没有写入权限是否是因为没有root?那么该怎么办?或者其实是别的原因导致得?  网上也看了很多资料,有的方法不行,有得看的不是很懂,写的都是没头没尾得。。还请各位大佬帮忙解惑下,或者有什么思路我们大家一起讨论。
 
 
问个问题居然不知不觉写了这么多 排版可能还有点杂 不知道各位大佬是否有耐心看完,在此先谢谢了。

解决方案 »

  1.   

    直接adb操作能够创建文件吗?另外你写文件会报错吗?
      

  2.   


    第一个问题。。直接adb操作,没试过,也不知道怎么操作
    第二个,我用系统自带的文件管理器写文件不会报错,再RE管理器里创建文件夹就报错。是提示没有root最后,感谢回复
      

  3.   

    楼主问题解决了吗,最近也需要做个将文件写入到USB外部设备
      

  4.   

    提升为系统APP权限,并且签名
      

  5.   

    Android5.0以上系统已经不支持开发者随便写手机的外部存储(包含tf卡、otg外接u盘等),必须用特定的方法去读写,自己搜一下DocumentFile 的使用吧...
    又或者只能操作固定的目录:Android/data/包名/...,这里面你可以随便做操作,不过app删了,这些数据也会自动删掉。
      

  6.   

    com.github.mjdev.libaums.fs
      

  7.   

    我也遇到了相关问题,目前还没解决。首先你这种还有可能是命名的问题:需要按照Google官方给出的规则来创建,即为:外部路径 + Android + data + 包名 + cache / file + 需要创建的文件夹名称;我这里按照上面的路径可以在U盘格式为ntfs的U盘上创建目录。但是fat32的不行。不知到楼主你有没有找到什么合适的办法
      

  8.   

    可以参考一下,实测可行。https://www.jianshu.com/p/a32e376ea70e