android开发关于和使用本机内存,内置存储卡和外置存储卡
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
关于android存储器简介:
android开发常常需要涉及数据缓存,这就需要我们了解手机当前使用的内存状况,是否存在外置存储卡,如果有怎么办,没有是否使用内置存储卡。
首先手机本机存储器,有Rom,Ram。
Rom :在android中Rom相当于系统盘,当C盘用 ,很多时候要使用需要获取root权限。
一般可以分为机身内存和内置存储(三星的多是叫:USB存储器);
机身内存包括system、data和cache等分区目录,软件默认都是安装机身内存或者内置存储卡里的 。
data(就是手机储存总量)+system(手机系统占用)
具体看是什么手机;
Ram:在相当于电脑的运行内存,运存 。不多做解释,就是随机运行时内存,断电数据全部消失。
外置存储器有:手机存储器 (TF卡), 相当于D,E ,F 等硬盘。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android开发中读取手机存储器和外置存储器。
Android读取手机内存之机身内存
这个我反复试验过,可以弄入以及读取数据到data目录下,但是需要获取root权限(这里是指使用的目录地址非当前应用在data中的目录地址),这个真有点纠结,难道要使用**软件的人都去root下?。嘿嘿,所以这里不推荐,这里就不粘贴代码了 ,要使用手机内存只能使用当前应用对应在data目录的地址了。下面是一个下载图片到手机内存的方法:(当前应用在data下对应的目录)
// 网络图片先下载到本地cache目录保存,以imagUrl的图片文件名保存。如果有同名文件在cache目录就从本地加载
public static Drawable loadImageFromUrl(Context context, String imageUrl) {
Drawable drawable = null;
if(imageUrl == null )
return null;
String imagePath = "";
String fileName = "";
// 获取url中图片的文件名与后缀
if(imageUrl!=null&&imageUrl.length()!=0){
fileName = imageUrl.substring(imageUrl.lastIndexOf("/")+1);
}
// 图片在手机本地的存放路径,注意:fileName为空的情况
imagePath = context.getCacheDir() + "/" + fileName;
Log.i(TAG,"context.getCacheDi = " + context.getCacheDir());
Log.i(TAG,"imagePath = " + imagePath);
File file = new File(imagePath);// 保存文件 同: File file = new File(context.getCacheDir(),fileName);
Log.i(TAG,"file.toString()=" + file.toString());
if(!file.exists()&&!file.isDirectory())
{
try {
// 可以在这里通过文件名来判断,是否本地有此图片
FileOutputStream fos=new FileOutputStream( file );
InputStream is = new URL(imageUrl).openStream();
int data = is.read();
while(data!=-1){
fos.write(data);
data=is.read();;
}
fos.close();
is.close();
// drawable = Drawable.createFromStream(
// new URL(imageUrl).openStream(), file.toString() ); // (InputStream) new URL(imageUrl).getContent();
drawable = Drawable.createFromPath(file.toString());
// Log.i(TAG, "file.exists()不文件存在,网上下载:" + drawable.toString());
} catch (IOException e) {
Log.e(TAG, e.toString() + "图片下载及保存时出现异常!");
}
}else
{
try {
FileInputStream filein=new FileInputStream(file);
drawable=Drawable.createFromStream(filein, "src");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//上面的方法同下;
//drawable = Drawable.createFromPath(file.toString());
// Log.i("test", "file.exists()文件存在,本地获取");
}
return drawable ;
}
Android读取手机内存之内置存储器实例
下面给出一个小例子来说明如何Android读取手机内存里的文件,这在Android开发中是比较重要的一部分,如何要是掌握不好的话,我们就没法把数据库里保存的数据给读出来,也就是说我们我们每一次玩游戏的时候,我们的数据库都是最原始的数据,这样就会给我们带来很多的麻烦。如果出现这样的事情,那么你的应用就是非常烂的,代码如下:
public static InputStream readInternalFileInputStream(Context context,String fileName){
/**
* 读取手机内存文件
*
*/
try{
FileInputStream fis = context.openFileInput(fileName);
return fis;
}catch(Exception e){
return null;
}
}
public static String readInternalFile(Context context,String fileName){
/**
* 读取手机内存文件
*
*/
try{
byte[] buffer = new byte[512];
int read =0;
StringBuffer stringbuffer = new StringBuffer();
FileInputStream fis = context.openFileInput(fileName);
do{
read = fis.read(buffer);
if(read>0)
stringbuffer.append(new String(buffer, 0, read, "utf-8"));
}while(read!=-1);
fis.close();
return stringbuffer.toString();
}catch(Exception e){
return null;
}
}
外置内存
android 读取sd卡中的图片
一 读取sd卡中的图片
1 获取读取sd的权限
在AndroidMainfest.xml文件中添加
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>
注意:在<application...></application>前添加
2 找到sd卡的目录(以真机的情况说明)
/**
*图片文件路径
*打印Environment.getExternalStorageDirectory()得到:"/mnt/sdcard",即找到了sd卡的根目录
*/
public String filePath=Environment.getExternalStorageDirectory()+"/client/tile/1_0_0.jpg";
3 根据路径获取图片
File mfile=new File(path);
if (mfile.exists()) {//若该文件存在
Bitmap bm = BitmapFactory.decodeFile(path);
return bm;
}
二 注意事项
在读取sd卡中图片的过程中的一些可用判断
1 Environment.getExternalStorageState()获取路径是否成功
/*如获取成功,返回值为MEDIA_MOUNTED*/
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
String filePath=Environment.getExternalStorageDirectory().getPath();
}
2 获取sd卡的权限成功
/*fileName=Environment.getExternalStorageDirectory()+"/client" 是个文件夹目录*/
File f = new File(fileName);
//可读
if(f.canRead())
Log.v("EagleTag","very bad");
//可写
if(f.canWrite())
Log.v("EagleTag","very good");
android的data和system以及cache系统目录讲解
原文:http://www.2cto.com/kf/201212/178288.html
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------Android 4.0中关于内外置存储卡读写权限问题
在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有了内外置sd卡的区,android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。
需要写外置sd卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这样就可以在外置sd卡中进行写入操作了。
这两个权限都被定义在android源码目录\frameworks\base\data\etc\platform.xml中:
使用到的类主要是framework/base/core/java/android/os/storage/StorageVolume.java及相同目录下的StorageManager.java文件。
StorageManager类可以获得所有的存储媒体列表,及StorageVolume类型的数组,从而可以获得对应存储是否可读写一类的信息。
问题在于 android 4.0的 SDK包中没有增加这个接口
解决的办法 一种是依赖 厂家将这2个权限默认为一个 也就是外部存储SD卡的android.permission.WRITE_EXTERNAL_STORAGE 和android.permission.WRITE_MEDIA_STORAGE等同 —— 这个是目前比较好的做法
第二种是: reflection 这个我具体没有弄过 待验证
第三种是 将你的源代码在 android的source code下编译 ; 或者得到厂家定制的android.jar包。
以上部分可参照原文,地址http://blog.sina.com.cn/s/blog_5da93c8f0101fgy9.html
转载请注明出处:http://blog.youkuaiyun.com/fth826595345/article/details/8823392#t8
待续.......