androidstorage
‘壹’ 求助,关于android开发中使用Storage的问题
sae-local是服务器环境的支持包,也就是说这个包的运行依赖于服务器的jvm,放在android环境里当然是不行的。
需求用需要在
建立java工程,利用sae包处理客户端的上传请求,android通过http post方式上传文件,路径是这样的
android --> http post stream --> server --> storage
‘贰’ 如何区分Android storage USB memory和 Sdcard
由于现在做平板开发,必须得分出这2个存储。
USB memory和 sdcard
一般就看Enviroment类的源码。
public static File getExternalStorageDirectory() {
// Try to be smarter
// Return EXTERNAL_STORAGE_DIRECTORY_SD if SD card is ready
// Return EXTERNAL_STORAGE_DIRECTORY_UDISK if SD card is absent but udisk is ready
// Return EXTERNAL_STORAGE_DIRECTORY_SD if both sd card and udisk are not ready
String propSD = SystemProperties.get("EXTERNAL_STORAGE_STATE_SD", MEDIA_REMOVED);
String propUDISK = SystemProperties.get("EXTERNAL_STORAGE_STATE_UDISK", MEDIA_REMOVED);
String propEXTSD = SystemProperties.get("EXTERNAL_STORAGE_STATE_EXTSD", MEDIA_REMOVED);
if (propSD.equals(MEDIA_MOUNTED) || propSD.equals(MEDIA_MOUNTED_READ_ONLY)) {
return EXTERNAL_STORAGE_DIRECTORY_SD;
} else if (propUDISK.equals(MEDIA_MOUNTED) || propUDISK.equals(MEDIA_MOUNTED_READ_ONLY)) {
return EXTERNAL_STORAGE_DIRECTORY_UDISK;
} else if (propEXTSD.equals(MEDIA_MOUNTED) || propEXTSD.equals(MEDIA_MOUNTED_READ_ONLY)) {
return EXTERNAL_STORAGE_DIRECTORY_EXTSD;} else {return EXTERNAL_STORAGE_DIRECTORY_SD;}}然后Environment.getExternalStorageDirectory().getAbsolutePath()
看返回的是"/sdcard"还是"/udisk"既可。
如果你直接指定这2个路径,去得到里面的文件时,是错误的!
storage就是手机的rom即(手机自带内存)
在手机里或同步电脑后,资源管理的根目录就可以看到这个storage的文件夹了.
‘肆’ 安卓系统,storage文件夹只有500多m,但是在设置的储存里显示全部空间占用有1.1g。
会有临时数据在隐藏目录下的情况,比如.开头的文件夹只能是有Root权限的手机用R.E.管理器访问的。
‘伍’ android 怎么从storage中获取文件数据
sae既然封装了存储路径 而且这个路径还不在主机服务器上
你就不能直接用http协议直接访问storage中的文件
但是你可以通过一个php页面把storage中的文件读出来在发送给前端
getshuju.php
<?php
echo file_get_contents('saestor://'.$domain.'/'.$filename);
page.html
$.ajax({
url:'getshuju.php'
‘陆’ Android外部存储ExternalStorage
内存(emory)
内部存储(ternalStorage)
1)storage或者mnt文件夹下
2) 通过:
Environment.getExternalStorageDirectory()
可以看到外部存储的位置
3) 公有目录(DCIM、DOWNLOAD等),要使用需要申请权限。
4) 私有目录(Android/data/应用包名),只能被当前应用访问。
String path= Environment.getExternalStorageDirectory().getAbsolutePath() +"/Mytest.txt";
try {
if (!file.exists()) {
file.createNewFile();
}
}catch (IOException e) {
e.printStackTrace();
}
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos=new FileOutputStream(path,true);
String str=infoEdt.getText().toString();
fos.write(str.getBytes());//以字节流的方式写入
}catch (IOException e) {
e.printStackTrace();
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其中第二条权限可能会报错,这时候解决办法是:
在报错的地方添加
tools:ignore="ProtectedPermissions"
同时在manifest标签里添加;
xmlns:tools="http://schemas.android.com/tools"
FileInputStream fis =new FileInputStream(path);
byte[] b =new byte[1024];
int len = fis.read(b);//读取fis字节流,将其存储在字节数组b中,并返回数组的长度(字节的个数)
String str2=new String(b,0,len);
txt.setText(str2);
注意:1、从外部存储读取文件不需要权限
2、Android6.0以上对外部存储(内存卡)共有目录的读写需要运行时权限(允许访问内存卡),这个权限需要用户手动开启,只在AndroidManifest.xml中申请是没用的。
int permissionContextCompet.checkSelfPermission(context,permission) 检查是否具有权限
第一个参数,环境上下文(this),第二个参数,权限名,Manifest.permission.WRITE_EXTERNAL_STORAGE,返回的是一个int类型的变量,将其与PackageManger.PERMISSION_GRANTED比较,等于则说明有权限,不等于的话则要动态申请权限:
if(permission!= PackageManager.PERMISSION_GRANTED){
//没有权限,则要申请权限
}
ActivityCompet.reaquestPermissions(activity,permission,code) 请求权限,第一个参数:activity 第二个参数:String类型的数组,里面装了各种权限, 当有多项权限需要申请的时候可以一起申请,第三个参数:一个int类型的请求码,动态申请权限的时候会触发onRequestPermissionsResult()方法,如果在申请的过程中有什么需要做的操作可以定义在该方法中,第三个参数请求吗可以帮助知道是那个权限的申请触发了这个方法
int permission=ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1){
//当前没有什么要处理的
}
}
通过:Environment.getExternalStorageDirectory()获取到的是根目录,通过在后面拼接目录名称,可以访问到公有目录
要获取外部存储目录的私有目录,可以通过:
1)Context.getExternalFilesDir(String type)获取到SDCard/Android/data/包名/files/目录,这个目录下一般存放一些需要长时间保存的数据。这个参数是用于指定文件夹类型的(图片,音乐,视频...)。
2)Context。getExternalCacheDir()获取到SDCard/Android/data/包名/cache/目录,这个目录下面一般存放一些临时的缓存性的数据。
‘柒’ 求助,关于android开发中使用Storage的问题
只用一种,按钮等元件的大小就完全跟着屏幕参数走了,火柴盒那么大小的按钮固然不美观,但比药片还小的按钮才真正要命:因为用户基本点不准
‘捌’ Android得到的真机的SD卡路径是 /storage/emulated/0/,该怎么解决
这是引用路径,别担心。
打开你的ddms File Explorer
你可以在你的mnt/sdcard后面看到一列info列
里面写的就是类似于/storage/emulated/0/这个东西
然后你可以在你的File Explorer中找到storage文件夹,下面就会有emulated,然后下面会有0
其实都是一样的