
小米手机只可以设置部分系统应用的默认存储位置,第三方应用需要在该应用中设置存储路径,系统应用默认存储位置设置方法如下:
1、打开手机设置;
2、选择打开存储,然后进入默认存储设置;
3、点击应用,选择外置SD卡即可。
:
SD卡存储卡,是用于手机、数码相机、便携式电脑、MP3和其他数码产品上的独立存储介质,一般是卡片的形态,故统称为“存储卡”,又称为“数码存储卡”、“数字存储卡”、“储存卡”等。
原来,只要把文件写在这里的话,可以不用动态申请权限,只要在manifest里面声明权限就ok了;
应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
并且在API
60之后,根目录文件存储是需要用户授权的,就算你在AndroidManifestxml中配置了存储权限,用户不授权也是写不进去了。
SD卡读写权限:
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?
通过
可以得到
这个目录里面,一般放一些长时间保存的数据
方法可以获取到 SDCard/ Android /data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过
方法可以获取到
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。并且
这个方法获得的文件存储路径适用于60以后系统,只要AndroidManifestxml配置读写权限了,就不需要用户再授权了。
正常开发中获取存储路径的方法是:
可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。
设置->应用->应用详情里面的”清除数据“与”清除缓存“选项分别对应的是data/data/<application package>/和data/data/<application package>/cache
external storage (外部存储):
EnvironmentgetExternalStorageDirectory()SD根目录:/mnt/sdcard/ (60后写入需要用户授权)
contextgetExternalFilesDir(dir)路径为:/mnt/sdcard/Android/data/< package name >/files/…
contextgetExternalCacheDir()路径为:/mnt/sdcard//Android/data/< package name >/cache/…
internal storage(内部存储):
contextgetFilesDir()路径是:/data/data/< package name >/files/…
contextgetCacheDir()路径是:/data/data/< package name >/cach/…
下载的东西分为APP软件和纯文件。
如果是手机应用,可以在“设置”里的“应用搬家”中转移到外置存储卡里。
如果是纯文件,可以在“我的文件“里转移到外置存储卡里。
具体 *** 作如下:
情形一:移动目标是APP软件。
1打开手机里的“设置”。
2找到“应用管理”并点击。
3在上次菜单栏中点击“已安装”。
4点击需要更改安装位置的软件,在“存储”列表中选择“应用”。
5在列表中点击“应用搬家”。
情形二:移动目标是纯文件
1、打开“我的文件”。
2、选择“内部存储”。
3、选择需要移动的文件夹,点击进入。
4、在菜单中选择“编辑”。
5、选择需要移动的文件。
6、点击“移动”。
7、选择好移动路径为SD外置存储,点击“确定”即可。
这里只介绍按下“保存”后如何将一个Bitmap对象保存为文件的执行步骤,对的下载,到Bitmap对象的转换,Bitmap对象的格式转换和压缩,以及界面设计部分全部都忽略了。
确定存储路径
获取外部存储权限
确定外部存储状态
确定文件名
保存到文件中
发送广播,通知系统扫描保存后的文件
确定存储路径
在Android中文件存储路径包括内部存储和外部存储两种类型。
对内部存储,当一个app被安装到手机后,Android系统会在内部存储的/data/data/目录下创建一个以包名称命名的文件夹。例如/data/data/comsohuinputmethodsogou/。一个应用对内部存储的所有访问都被限制在这个文件夹中,也就是说Android应用只能在该目录中读取,创建,修改文件。对该目录之外的其他内部存储中的目录都没有任何 *** 作的权限。因此,如果将保存在内部存储中,只能被应用自身读取,其他应用均无法读取。如果需要让系统图库,相册或其他应用能够找到保存的,必须将保存到外部存储中。
对外部存储,当一个app被安装到手机后,Android系统会在外部存储的/Android/data/目录下创建一个以包名命名的文件夹(这里第一个/不是根路径,而是相对外部存储所挂载路径的相对路径)。例如/storage/emulated/0/Android/data/comsohuinputmethod/。这个路径同样只能被应用自身读取,其他应用不能访问。因此,也不能将保存在这个目录中。
除外部存储的/Android目录之外的其他目录一般都是可以被其他应用访问的。目前,大多数应用都会在外部存储的根路径下建立一个类似包名的多层目录,以存储需要共享的文件。例如/storage/emulated/0/sogou/image/。还需要注意的是,很多查看的应用都支持按照文件夹来查看。如果将所在的文件夹取名为image,photo之类的,就无法和其他文件夹区分开,用户也不能识别该文件夹的用途。因此最好取一个有区分度的文件夹名字,例如百度贴吧就保存在/tieba目录,微信是保存在/tencent/MicroMsg/WeiXin目录。
由于Android系统的碎片化问题,不同设备上外部存储的路径很可能会不同,因此,不能直接使用/storage/emulated/0/作为外部存储的根路径。
Android SDK中 Environment类 提供了getExternalStorageDirectory()方法来获取外部存储的根路径。示例如下:
[java] view plain copy
String dir = EnvironmentgetExternalStorageDirectory()getAbsolutePath() + "/tencent/MicroMsg/WeiXin/"
需要注意的是EnvironmentgetExternalStorageDirectory()返回的路径中最后一个字符不是/,如果需要创建子目录,需要在子目录的前后都加上/。
获取外部存储权限
由于需要在外部存储中写文件,需要在AndroidManifestxml中增加如下的权限声明。
[java] view plain copy
<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>
确定外部存储状态
由于外部存储需要被挂载,也可以被卸载,在写入文件之前,需要先判断外部存储的状态是否正常。只有状态正常情况下才可以执行保存文件的 *** 作。获取外部存储状态同样是通过Environment类,通过EnvironmentgetExternalStorageState()可以得到一个字符串,来表示外部存储的状态。同时在Environment类中定义了一系列的String常量表示不同的状态。在所有的状态中只有内部存储处于EnvironmentMEDIA_MOUNTED状态时才可以读写文件,因此,需要将获取到的状态和EnvironmentMEDIA_MOUNTED做比较,如果不是EnvironmentMEDIA_MOUNTED状态,就返回保存失败。示例如下。
[java] view plain copy
//获取内部存储状态
String state = EnvironmentgetExternalStorageState();
//如果状态不是mounted,无法读写
if (!stateequals(EnvironmentMEDIA_MOUNTED)) {
return;
}
确定文件名
保存的文件名可以由应用根据自身需要自行确定,一般来说需要有一个命名规则,然后根据命名规则计算得到文件名。
这里列举几种常见的命名规则。
随机命名
这种命名规则是随机生成一个字符串或一组数字来对命名。
字符串可以通过UUID来生成,数字可以通过Random()类来生成,例如:
[java] view plain copy
//通过UUID生成字符串文件名
String fileName1 = UUIDrandomUUID()toString();
//通过Random()类生成数组命名
Random random = new Random();
String fileName2 = StringvalueOf(randomnextInt(IntegerMAX_VALUE));
这种命名规则是按照数字从小到大的顺序来对命名。
在程序启动时先获取文件名中当前最大数字的文件名,之后每保存一张就将数字加1即可。
时间命名
这种命名规则是根据保存的当前系统时间来对命名。
系统时间可以通过SystemcurrentTimeMillis()来获取,不过SystemcurrentTimeMillis()获取到的时间是一个long型的整数,如果用它做文件名,无法通过文件名直接看出文件的具体保存时间。可以通过SimpleDateFormat先对当前时间做格式化,然后再将其作为文件名来使用。例如:
[java] view plain copy
使用这种命名规则来命名需要注意的是同一秒钟可能会有多张需要保存,在得到当前系统时间对应的文件名后,需要判断该文件是否存在。如果文件已经存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名后加上一个随机数后缀,或者是用毫秒数做后缀。
Calendar now = new GregorianCalendar();
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyyMMddHHmmss", LocalegetDefault());
String fileName = simpleDateformat(nowgetTime());
文件URL命名
每张网络都有一个对应的URL,可以根据的URL来对命名。
不过URL中会包含一些不能用作文件名的特殊字符,此外直接用URL来命名可能会带来安全问题。为了避免这两个问题,可以将URL的MD5值作为文件名来使用。由于MD5是不可逆的,也就无法通过MD5值反向得到URL,同时MD5值对应的字符串只包含[0-9A-Z],不包含特殊字符,可是作为文件名使用。
由于每张的URL是唯一的,其对应的文件名也就是唯一的。如果需要每张网络只能生成一个文件,不允许保存为多份拷贝,可以用这种命名规则。在得到URL对应的文件名后,先判断文件是否已经存在,如果已经存在,直接覆盖或不处理。
保存到文件中
保存文件时,通过Bitmap的compress()方法将Bitmap对象压缩到一个文件输出流中,然后flush()即可。示例如下。
[java] view plain copy
try {
File file = new File(dir + fileName + "jpg");
FileOutputStream out = new FileOutputStream(file);
mBitmapcompress(BitmapCompressFormatJPEG, 100, out);
outflush();
outclose();
} catch (Exception e) {
eprintStackTrace();
}
发送广播,通知系统扫描保存后的文件
至此,已经实现将Bitmap对象保存成外部存储中的一个jpg格式的文件。但此时该文件只是保存在外部存储的一个目录中,必须进入其所在的目录中才可以看到。在系统图库,相册和其他应用中无法看到新建的文件。为了让其他应用能够知道文件被创建,必须通知MediaProvider服务将新建的文件添加到数据库中。
Android系统中常驻一个MediaProvider服务,对应的进程名为androidprocessmedia,此服务用来管理本机上的媒体文件,提供媒体管理服务。在系统开机或者收到外部存储的挂载消息后,MediaProvider会调用MediaScanner,MediaScanner会扫描外部存储中的所有文件,根据文件类型的后缀将文件信息保存到对应的数据库中,供其他APP使用。
MediaScannerReceiver是一个广播接收者,当它接收到特定的广播请求后,就会去扫描指定的文件,并根据文件信息将其添加到数据库中。当文件被创建后,就可以发送广播给MediaScannerReceiver,通知其扫描新建的文件。示例如下。
[java] view plain copy
try {
File file = new File(dir + fileName + "jpg");
FileOutputStream out = new FileOutputStream(file);
mBitmapcompress(BitmapCompressFormatJPEG, 100, out);
outflush();
outclose();
//保存后发送广播通知更新数据库
Uri uri = UrifromFile(file);
sendBroadcast(new Intent(IntentACTION_MEDIA_SCANNER_SCAN_FILE, uri));
} catch (Exception e) {
eprintStackTrace();
}
的异步保存
保存文件时,如果很大,或需要同时保存多张时,就需要较多的时间。为了避免阻塞UI线程,出现帧率下降或ANR,通常需要将保存 *** 作放到线程中去执行。当保存完毕后通过sendMessage()方法通知UI线程保存结果。
将保存放到后台线程去执行需要增加一些同步机制避免一些多线程问题。例如有两张需要保存,分别放到两个线程中去执行,保存时文件名以数字顺序增加。第一个线程选中文件名为125jpg,但此时文件还未创建,第二个线程判断125jpg不存在,于是也选取125jpg作为文件名,两张就保存到同一个文件中了。
OPPO手机怎么使用SD卡,OPPO手机安装SD卡后,进入手机中各类软件的设置中,将存储路径改为外置存储卡即可以网易云音乐为例,进入网易云音乐的设置——设置下载目录——选择存储卡2即可
以上就是关于小米系统怎样设置存储到外置存储卡全部的内容,包括:小米系统怎样设置存储到外置存储卡、android app文件目录结构、我的手机是oppo A33下的文件全在手机内存上,谁知道怎么移到外置存储卡里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)