⑴ Android 保存图片到本地。
这里只介绍按下“保存”后如何将一个Bitmap对象保存为图片文件的执行步骤,对图片的下载,图片到Bitmap对象的转换,Bitmap对象的格式转换和压缩,以及界面设计部分全部都忽略了。
确定存储路径
获取外部存储权限
确定外部存储状态
确定文件名
保存到文件中
发送广播,通知系统扫描保存后的文件
确定存储路径
在Android中文件存储路径包括内部存储和外部存储两种类型。
对内部存储,当一个app被安装到手机后,Android系统会在内部存储的/data/data/目录下创建一个以包名称命名的文件夹。例如/data/data/com.sohu.inputmethod.sogou/。一个应用对内部存储的所有访问都被限制在这个文件夹中,也就是说Android应用只能在该目录中读取,创建,修改文件。对该目录之外的其他内部存储中的目录都没有任何操作的权限。因此,如果将图片保存在内部存储中,只能被应用自身读取,其他应用均无法读取。如果需要让系统图库,相册或其他应用能够找到保存的图片,必须将图片保存到外部存储中。
对外部存储,当一个app被安装到手机后,Android系统会在外部存储的/Android/data/目录下创建一个以包名命名的文件夹(这里第一个/不是根路径,而是相对外部存储所挂载路径的相对路径)。例如/storage/emulated/0/Android/data/com.sohu.inputmethod/。这个路径同样只能被应用自身读取,其他应用不能访问。因此,也不能将图片保存在这个目录中。
除外部存储的/Android目录之外的其他目录一般都是可以被其他应用访问的。目前,大多数应用都会在外部存储的根路径下建立一个类似包名的多层目录,以存储需要共享的文件。例如/storage/emulated/0/sogou/image/。还需要注意的是,很多查看图片的应用都支持按照文件夹来查看图片。如果将图片所在的文件夹取名为image,photo之类的,就无法和其他文件夹区分开,用户也不能识别该文件夹的用途。因此最好取一个有区分度的文件夹名字,例如网络贴吧就保存在/tieba目录,微信是保存在/tencent/MicroMsg/WeiXin目录。
由于Android系统的碎片化问题,不同设备上外部存储的路径很可能会不同,因此,不能直接使用/storage/emulated/0/作为外部存储的根路径。Android SDK中 Environment类 提供了getExternalStorageDirectory()方法来获取外部存储的根路径。示例如下:
[java]view plain
Stringdir=Environment.getExternalStorageDirectory().getAbsolutePath()+"/tencent/MicroMsg/WeiXin/"
需要注意的是Environment.getExternalStorageDirectory()返回的路径中最后一个字符不是/,如果需要创建子目录,需要在子目录的前后都加上/。
获取外部存储权限
由于需要在外部存储中写文件,需要在AndroidManifest.xml中增加如下的权限声明。
[java]view plain
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
确定外部存储状态
由于外部存储需要被挂载,也可以被卸载,在写入文件之前,需要先判断外部存储的状态是否正常。只有状态正常情况下才可以执行保存文件的操作。获取外部存储状态同样是通过Environment类,通过Environment.getExternalStorageState()可以得到一个字符串,来表示外部存储的状态。同时在Environment类中定义了一系列的String常量表示不同的状态。在所有的状态中只有内部存储处于Environment.MEDIA_MOUNTED状态时才可以读写文件,因此,需要将获取到的状态和Environment.MEDIA_MOUNTED做比较,如果不是Environment.MEDIA_MOUNTED状态,就返回保存失败。示例如下。
[java]view plain
//获取内部存储状态
Stringstate=Environment.getExternalStorageState();
//如果状态不是mounted,无法读写
if(!state.equals(Environment.MEDIA_MOUNTED)){
return;
}
确定文件名
保存的图片文件名可以由应用根据自身需要自行确定,一般来说需要有一个命名规则,然后根据命名规则计算得到文件名。这里列举几种常见的命名规则。
随机命名这种命名规则是随机生成一个字符串或一组数字来对图片命名。字符串可以通过UUID来生成,数字可以通过Random()类来生成,例如:
[java]view plain
//通过UUID生成字符串文件名
StringfileName1=UUID.randomUUID().toString();
//通过Random()类生成数组命名
Randomrandom=newRandom();
StringfileName2=String.valueOf(random.nextInt(Integer.MAX_VALUE));
这种命名规则是按照数字从小到大的顺序来对图片命名。在程序启动时先获取图片文件名中当前最大数字的文件名,之后每保存一张图片就将数字加1即可。
时间命名这种命名规则是根据保存图片的当前系统时间来对图片命名。系统时间可以通过System.currentTimeMillis()来获取,不过System.currentTimeMillis()获取到的时间是一个long型的整数,如果用它做文件名,无法通过文件名直接看出文件的具体保存时间。可以通过SimpleDateFormat先对当前时间做格式化,然后再将其作为文件名来使用。例如:
[java]view plain
使用这种命名规则来命名需要注意的是同一秒钟可能会有多张图片需要保存,在得到当前系统时间对应的文件名后,需要判断该文件是否存在。如果文件已经存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名后加上一个随机数后缀,或者是用毫秒数做后缀。
Calendarnow=newGregorianCalendar();
SimpleDateFormatsimpleDate=newSimpleDateFormat("yyyyMMddHHmmss",Locale.getDefault());
StringfileName=simpleDate.format(now.getTime());
文件URL命名每张网络图片都有一个对应的图片URL,可以根据图片的URL来对图片命名。不过URL中会包含一些不能用作文件名的特殊字符,此外直接用URL来命名可能会带来安全问题。为了避免这两个问题,可以将图片URL的MD5值作为文件名来使用。由于MD5是不可逆的,也就无法通过MD5值反向得到图片URL,同时MD5值对应的字符串只包含[0-9A-Z],不包含特殊字符,可是作为文件名使用。由于每张图片的URL是唯一的,其对应的文件名也就是唯一的。如果需要每张网络图片只能生成一个文件,不允许保存为多份拷贝,可以用这种命名规则。在得到URL对应的文件名后,先判断文件是否已经存在,如果已经存在,直接覆盖或不处理。
保存到文件中
保存图片文件时,通过Bitmap的compress()方法将Bitmap对象压缩到一个文件输出流中,然后flush()即可。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
}catch(Exceptione){
e.printStackTrace();
}
发送广播,通知系统扫描保存后的文件
至此,已经实现将Bitmap对象保存成外部存储中的一个jpg格式的文件。但此时该文件只是保存在外部存储的一个目录中,必须进入其所在的目录中才可以看到。在系统图库,相册和其他应用中无法看到新建的图片文件。为了让其他应用能够知道图片文件被创建,必须通知MediaProvider服务将新建的文件添加到图片数据库中。
Android系统中常驻一个MediaProvider服务,对应的进程名为android.process.media,此服务用来管理本机上的媒体文件,提供媒体管理服务。在系统开机或者收到外部存储的挂载消息后,MediaProvider会调用MediaScanner,MediaScanner会扫描外部存储中的所有文件,根据文件类型的后缀将文件信息保存到对应的数据库中,供其他APP使用。
MediaScannerReceiver是一个广播接收者,当它接收到特定的广播请求后,就会去扫描指定的文件,并根据文件信息将其添加到数据库中。当图片文件被创建后,就可以发送广播给MediaScannerReceiver,通知其扫描新建的图片文件。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
//保存图片后发送广播通知更新数据库
Uriuri=Uri.fromFile(file);
sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));
}catch(Exceptione){
e.printStackTrace();
}
图片的异步保存
保存图片文件时,如果图片很大,或需要同时保存多张图片时,就需要较多的时间。为了避免阻塞UI线程,出现帧率下降或ANR,通常需要将图片保存操作放到线程中去执行。当图片保存完毕后通过sendMessage()方法通知UI线程保存结果。将图片保存放到后台线程去执行需要增加一些同步机制避免一些多线程问题。例如有两张图片需要保存,分别放到两个线程中去执行,保存图片时文件名以数字顺序增加。第一个线程选中文件名为125.jpg,但此时文件还未创建,第二个线程判断125.jpg不存在,于是也选取125.jpg作为文件名,两张图片就保存到同一个文件中了。
⑵ Android如何把图片保存到SDcard中
很简单,使用下面的程序就可以了: package com.savemybitmap; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.graphics.Bitmap; import android.os.Environment; import android.util.Log; /** * 保存图片的类 * * @author Administrator * */ public class SaveBitmap { private final static String CACHE = "/Caochen"; /** * 保存图片的方法 * 保存到sdcard * @throws IOException */ public void savePic(Bitmap b, String strFileName) { String filePath = isExistsFilePath(); FileOutputStream fos = null; GetImageName getName = new GetImageName(); String imageName = getName.getImageName(strFileName); File file = new File(filePath, imageName); if (file.exists()) { Log.i(imageName, "is Exist!!!"); } else { try { fos = new FileOutputStream(file); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * 获取sd卡的缓存路径, * 一般在卡中sdCard就是这个目录 * * @return SDPath */ public static String getSDPath() { File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在 if (sdCardExist) { sdDir = Environment.getExternalStorageDirectory();// 获取根目录 } else { Log.e("ERROR", "没有内存卡"); } return sdDir.toString(); } /** * 获取缓存文件夹目录 如果不存在创建 否则则创建文件夹 * * @return filePath */ private String isExistsFilePath() { String filePath = getSDPath() + CACHE; File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } return filePath; } }满意请采纳
⑶ android修改后的图片用什么方式保存
可以的需要第三方软件。再有一个就是像rootexplorer这种文件管理器也是可以通过root权限授予,可以修改体统程序的txt文件更改一些低级别文件重写。
⑷ android手机里的照片在哪个文件夹里
android手机里的照片在DCIM-Camera文件夹。
具体步骤:
1、先将手机与电脑相连,在电脑上找到可移动磁盘设备,点击打开。
(4)android文件保存图片扩展阅读:
定义
1. DCIM (Data Center Infrastructure management) 数据中心基础设施管理 是将IT(信息技术)和设备管理结合起来对数据中心关键设备进行集中监控、容量规划等集中管理。通过软件、硬件和传感器等,DCIM提供一个独立的管理平台,对数据中心IT设备和基础设施进行实时监控和管理。
3. 离散福镜像法:方程(MPIE)的矩量法是目前分析微带结构的主要方法之一.MPIE算法的核心是空域格林函数的求解.提出了二级离散复镜像法(DCIM)与表面波处理相结合的方法对空域格林函数进行计算.根据表面波的性质,提出了2种二级DCIM和表面波相结合的方案,分段比较两方案的…
4. 接口模块:Dominion 电脑接口模块 (DCIM),这是一种非常小的转接头,直接插入服务器的键盘、视频及鼠标连接端口。
5. DCIM(Data Center Integrated Management)数据中心集成管理
⑸ android如何保存html文件,包括其中的图片。
1、先示例图片
2、操作代码
package com.nekocode.xue.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.nekocode.xue.PublicData;
import com.nekocode.xue.PublicData.Subscribe;
public class HtmlStorageHelper {
private String URL = "http://eproject.sinaapp.com/fetchurl.php/getcontent/";
private PublicData pd;
private AQuery aq;
private SQLiteDatabase mDB;
private String mDownloadPath;
public HtmlStorageHelper(Context context) {
pd = PublicData.getInstance();
aq = new AQuery(context);
mDB = context.openOrCreateDatabase("data.db", Context.MODE_PRIVATE, null);
mDB.execSQL("create table if not exists download_html(_id INTEGER PRIMARY KEY AUTOINCREMENT, content_id TEXT NOT NULL, title TEXT NOT NULL)");
mDownloadPath = pd.mAppPath + "download/";
File dir_file = new File(pd.mAppPath + "download/");
if(!dir_file.exists())
dir_file.mkdir();
}
public void saveHtml(final String id, final String title) {
if(isHtmlSaved(id))
return;
aq.ajax(URL+id, String.class, new AjaxCallback<String>() {
@Override
public void callback(String url, String html, AjaxStatus status) {
File dir_file = new File(mDownloadPath + id);
if(!dir_file.exists())
dir_file.mkdir();
Pattern pattern = Pattern.compile("(?<=src=")[^"]+(?=")");
Matcher matcher = pattern.matcher(html);
StringBuffer sb = new StringBuffer();
while(matcher.find()){
downloadPic(id, matcher.group(0));
matcher.appendReplacement(sb, formatPath(matcher.group(0)));
}
matcher.appendTail(sb);
html = sb.toString();
writeHtml(id, title, html);
}
});
}
private void downloadPic(String id, String url) {
File pic_file = new File(mDownloadPath + id + "/" + formatPath(url));
aq.download(url, pic_file, new AjaxCallback<File>() {
@Override
public void callback(String url, final File file, AjaxStatus status) {
}
});
}
private void writeHtml(String id, String title, String html) {
File html_file = new File(mDownloadPath + id + "/index.html");
FileOutputStream fos = null;
try {
fos=new FileOutputStream(html_file);
fos.write(html.getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
fos.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
ContentValues values = new ContentValues();
values.put("content_id", id);
values.put("title", title);
mDB.insert("download_html", "_id", values);
}
public boolean isHtmlSaved(String id) {
File file = new File(mDownloadPath + id);
if(file.exists()) {
file = new File(mDownloadPath + id + "/index.html");
if(file.exists())
return true;
}
deleteHtml(id);
return false;
}
public String getTitle(String id) {
Cursor c = mDB.rawQuery("select * from download_html where content_id=?", new String[]{id});
if(c.getCount() == 0)
return null;
c.moveToFirst();
int index1 = c.getColumnIndex("title");
return c.getString(index1);
}
public ArrayList<Subscribe> getHtmlList() {
Cursor c = mDB.rawQuery("select * from download_html", null);
ArrayList<Subscribe> list = new ArrayList<Subscribe>();
if(c.getCount() != 0) {
c.moveToFirst();
int index1 = c.getColumnIndex("content_id");
int index2 = c.getColumnIndex("title");
while (!c.isAfterLast()) {
String id = c.getString(index1);
if(isHtmlSaved(id)) {
Subscribe sub = new Subscribe(
id,
c.getString(index2),
Subscribe.FILE_DOWNLOADED
);
list.add(sub);
}
c.moveToNext();
}
}
return list;
}
public void deleteHtml(String id) {
mDB.delete("download_html", "content_id=?", new String[]{id});
File dir_file = new File(mDownloadPath + id);
deleteFile(dir_file);
}
private void deleteFile(File file) {
if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
}
}
file.delete();
} else {
//
}
}
private String formatPath(String path) {
if (path != null && path.length() > 0) {
path = path.replace("\", "_");
path = path.replace("/", "_");
path = path.replace(":", "_");
path = path.replace("*", "_");
path = path.replace("?", "_");
path = path.replace(""", "_");
path = path.replace("<", "_");
path = path.replace("|", "_");
path = path.replace(">", "_");
}
return path;
}
}
3、这段代码简单修改就可以用到自己的项目中了
⑹ android 如何将drawable中的图片保存到系统相册中
android 将drawable中的图片保存到系统相册中的原理比较简单,获取到的bitmap,然后通过的compress方法写到一个fileoutputstream中. 再通知MediaScannerService有图片文件加入就可以了.保存图片的核心代码如下:Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.icon);MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, name, "");或者FileOutputStream fos = openFileOutput("image", Context.MODE_PRIVATE); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); //发送系统通知消息context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));另一种方法是直接使用文件流读写:InputStream is = mContext.getResources().openRawResource(PicID);FileOutputStream fos = new FileOutputStream(LogoFilePath); byte[] buffer = new byte[8192]; int count = 0; while((count=is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); 这里要注意目录权限问题:在应用程序AndroidManifest.xml中的manifest节点中加入android:sharedUerId="android.uid.system"这个属性。然后放在源码环境中编译,并通过adb install 的方式进行安装。mk文件中的属性改为LOCAL_CERTIFICATE :=platform。
⑺ 安卓手机的微信接收到的图片保存在哪个文件夹
1、在手机桌面选择并打开【文件管理】,如:ES文件浏览器,RE管理器等,版如图所示;
⑻ 安卓手机照片一般存在哪个文件夹
一般在存储在手机存储-DCIM-Camera下面
1、打开桌面上的文件管理器
(8)android文件保存图片扩展阅读:
截图生成的图片资源存储位置:手机存储-DCIM-ScreenShots文件夹下
由手机淘宝,美团生成的缓存图片存储位置:手机存储-Pictures
图片存储太多会占用很大内存空间,定期清理,可以便程序运行不卡顿,使用手机上手机管家之类的软件,定时清除缓存数据,手机那些上网浏览缓存下来的照片就会被删掉,也可以自己找出来删。
⑼ 安卓系统所有照片存在哪个文件夹
点击【文件管理】中的【内部存储】,进去内部存储界面之后,点击tencent,点击MicroMsg。点击进去Download文件夹,就看到手机微信接收的文件。具体介绍如下:1、一般都是在腾讯文件夹中找到微信的下载文件夹即可,首先打开手机的文件管理器,点击【内部存储】;2、打开内部存储界面之后,点击【tencent】,然后选择【MicroMsg】3、进入文件夹之后再选择【Download】文件夹;进去Download文件夹之后,可以看到手机微信接收的文件。打开手机的相机,一般在右上角会有【设置】的图标,点击进入相机的设置菜单;看到路径之后,使用手机的文件管理器复制路径进入该目录,就可以看到视频文件。以下是详细介绍:1、打开手机的相机,一般在右上角会有【设置】的图标,点击进入相机的设置菜单;2、切换到视频拍摄选项中就可以看到视频的保存路线,您可以将其复制;3、打开文件管理器,点击手机,按照路径进入DICM目录,进入到相机目录,那么就可以看到视频文件;存储在手机内置存储空间中的默认查看路径是:【我的文件】-【sdcard0/设备存储】-【DCIM】-【Camera】;存储在存储卡中的默认查看路径是:【我的文件】-【extSdcard/SD card】-【DCIM】-【Camera】;
未经允许不得转载:山九号 » android文件保存图片|安卓手机的微信接收到的图片保存在哪个文件夹