重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
android已知本地图片的路径,将他设为imageview的背景,文件夹的路径:
创新互联是一家集网站建设,宜春企业网站建设,宜春品牌网站建设,网站定制,宜春网站建设报价,网络营销,网络优化,宜春网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
String img_path = "image will be with image type";
Bitmap bmp= BitmapFactory.decodeFile(img_path);
ImageView iv= (ImageView)findViewById(R.id.img);
iv.setImageBitmap(bmp)。
添加文件的权限:
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/
Android本身不提供使用图片路径来设置view背景的。既然我们已经知道了图片的path,就可以先将图片转成drawable,然后在设置给LinearLayout来做背景。
这里只介绍按下“保存”后如何将一个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 copy
String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tencent/MicroMsg/WeiXin/"
需要注意的是Environment.getExternalStorageDirectory()返回的路径中最后一个字符不是/,如果需要创建子目录,需要在子目录的前后都加上/。
获取外部存储权限
由于需要在外部存储中写文件,需要在AndroidManifest.xml中增加如下的权限声明。
[java] view plain copy
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/
确定外部存储状态
由于外部存储需要被挂载,也可以被卸载,在写入文件之前,需要先判断外部存储的状态是否正常。只有状态正常情况下才可以执行保存文件的操作。获取外部存储状态同样是通过Environment类,通过Environment.getExternalStorageState()可以得到一个字符串,来表示外部存储的状态。同时在Environment类中定义了一系列的String常量表示不同的状态。在所有的状态中只有内部存储处于Environment.MEDIA_MOUNTED状态时才可以读写文件,因此,需要将获取到的状态和Environment.MEDIA_MOUNTED做比较,如果不是Environment.MEDIA_MOUNTED状态,就返回保存失败。示例如下。
[java] view plain copy
//获取内部存储状态
String state = Environment.getExternalStorageState();
//如果状态不是mounted,无法读写
if (!state.equals(Environment.MEDIA_MOUNTED)) {
return;
}
确定文件名
保存的图片文件名可以由应用根据自身需要自行确定,一般来说需要有一个命名规则,然后根据命名规则计算得到文件名。
这里列举几种常见的命名规则。
随机命名
这种命名规则是随机生成一个字符串或一组数字来对图片命名。
字符串可以通过UUID来生成,数字可以通过Random()类来生成,例如:
[java] view plain copy
//通过UUID生成字符串文件名
String fileName1 = UUID.randomUUID().toString();
//通过Random()类生成数组命名
Random random = new Random();
String fileName2 = String.valueOf(random.nextInt(Integer.MAX_VALUE));
这种命名规则是按照数字从小到大的顺序来对图片命名。
在程序启动时先获取图片文件名中当前最大数字的文件名,之后每保存一张图片就将数字加1即可。
时间命名
这种命名规则是根据保存图片的当前系统时间来对图片命名。
系统时间可以通过System.currentTimeMillis()来获取,不过System.currentTimeMillis()获取到的时间是一个long型的整数,如果用它做文件名,无法通过文件名直接看出文件的具体保存时间。可以通过SimpleDateFormat先对当前时间做格式化,然后再将其作为文件名来使用。例如:
[java] view plain copy
使用这种命名规则来命名需要注意的是同一秒钟可能会有多张图片需要保存,在得到当前系统时间对应的文件名后,需要判断该文件是否存在。如果文件已经存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名后加上一个随机数后缀,或者是用毫秒数做后缀。
Calendar now = new GregorianCalendar();
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
String fileName = 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 copy
try {
File file = new File(dir + fileName + ".jpg");
FileOutputStream out = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
发送广播,通知系统扫描保存后的文件
至此,已经实现将Bitmap对象保存成外部存储中的一个jpg格式的文件。但此时该文件只是保存在外部存储的一个目录中,必须进入其所在的目录中才可以看到。在系统图库,相册和其他应用中无法看到新建的图片文件。为了让其他应用能够知道图片文件被创建,必须通知MediaProvider服务将新建的文件添加到图片数据库中。
Android系统中常驻一个MediaProvider服务,对应的进程名为android.process.media,此服务用来管理本机上的媒体文件,提供媒体管理服务。在系统开机或者收到外部存储的挂载消息后,MediaProvider会调用MediaScanner,MediaScanner会扫描外部存储中的所有文件,根据文件类型的后缀将文件信息保存到对应的数据库中,供其他APP使用。
MediaScannerReceiver是一个广播接收者,当它接收到特定的广播请求后,就会去扫描指定的文件,并根据文件信息将其添加到数据库中。当图片文件被创建后,就可以发送广播给MediaScannerReceiver,通知其扫描新建的图片文件。示例如下。
[java] view plain copy
try {
File file = new File(dir + fileName + ".jpg");
FileOutputStream out = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
//保存图片后发送广播通知更新数据库
Uri uri = Uri.fromFile(file);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
} catch (Exception e) {
e.printStackTrace();
}
图片的异步保存
保存图片文件时,如果图片很大,或需要同时保存多张图片时,就需要较多的时间。为了避免阻塞UI线程,出现帧率下降或ANR,通常需要将图片保存操作放到线程中去执行。当图片保存完毕后通过sendMessage()方法通知UI线程保存结果。
将图片保存放到后台线程去执行需要增加一些同步机制避免一些多线程问题。例如有两张图片需要保存,分别放到两个线程中去执行,保存图片时文件名以数字顺序增加。第一个线程选中文件名为125.jpg,但此时文件还未创建,第二个线程判断125.jpg不存在,于是也选取125.jpg作为文件名,两张图片就保存到同一个文件中了。
下面是android多线程下载例子截图:
package mm.shandong.com.testmultithreaddownload;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
import mm.shandong.com.testmultithreaddownload.thread.UpdateUIThread;
import mm.shandong.com.testmultithreaddownload.util.FileUtil;
public class TestMultiThreadDownLoadActivity extends AppCompatActivity {
ProgressDialog pb;
EditText editText;
Handler handler;
private UpdateUIThread mUpdateUIThread = null;
///文件路径
private String url =
"";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_multi_thread_down_load);
editText = (EditText) findViewById(R.id.editText);
initHandler();
}
public void initHandler() {
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FileUtil.startDownloadMeg:
pb.setMax(mUpdateUIThread.getFileSize()); //开始
break;
case FileUtil.updateDownloadMeg:
if (!mUpdateUIThread.isCompleted()) //下载进度消息
{
pb.setProgress(mUpdateUIThread.getDownloadSize());
pb.setMessage("下载速度:" +
mUpdateUIThread.getDownloadSpeed() + "k/秒 " +
" 下载百分比" + mUpdateUIThread.getDownloadPercent() + "%");
} else {
pb.setMessage("下载完成");
}
break;
case FileUtil.endDownloadMeg:
Toast.makeText(TestMultiThreadDownLoadActivity.this,
"下载完成,马上安装", Toast.LENGTH_SHORT).show();
/*apk安装界面跳转*/
String filename = FileUtil.getFileName(url);
String str = "/myfile/" + filename;
String fileName = Environment.getExternalStorageDirectory() + str;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)),
"application/vnd.android.package-archive");
startActivity(intent);
break;
}
super.handleMessage(msg);
}
};
}
///开始下载软件
public void startDownLoad(View view) {
if (TextUtils.isEmpty(editText.getText().toString())) {
Toast.makeText(this, "你输入下载文件地址", Toast.LENGTH_SHORT).show();
return;
} else {
url = editText.getText().toString();
}
//启动线程初始化下载参数
mUpdateUIThread = new UpdateUIThread(handler, url,
FileUtil.setMkdir(this) + File.separator, FileUtil.getFileName(url));
pb = new ProgressDialog(this);
pb.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pb.show();
mUpdateUIThread.start();
}
}
例子代码太长,只能给你一部分,如果想看完整例子代码,请去360手机助手下载安卓学习手册,点击里面的源码可以查看完成代码,方面快速,里面还有安卓的其它小例子,共108个。
相册图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReferenceBitmap)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。1.内存缓存//需要导入外部jar文件 android-support-v4.jar
import android.support.v4.util.LruCache;
//开辟8M硬缓存空间
private final int hardCachedSize = 8*1024*1024;
//hard cache
private final LruCacheString, Bitmap sHardBitmapCache = new LruCacheString, Bitmap(hardCachedSize){
@Override
public int sizeOf(String key, Bitmap value){
return value.getRowBytes() * value.getHeight();
}
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue){
Log.v("tag", "hard cache is full , push to soft cache");
//硬引用缓存区满,将一个最不经常使用的oldvalue推入到软引用缓存区
sSoftBitmapCahe.put(key, new SoftReferenceBitmap(oldValue));
}
}
详细
android手机里的照片在DCIM-Camera文件夹。
具体步骤:
1、先将手机与电脑相连,在电脑上找到可移动磁盘设备,点击打开。
2、然后在所有文件夹中找到DCIM文件夹,点击打开。DCIM (Data Center Infrastructure management) 数据中心基础设施管理。
3、然后在DCIM文件夹中找到camera文件夹,就找到照片了。
扩展资料:
定义
1. DCIM (Data Center Infrastructure management) 数据中心基础设施管理 是将IT(信息技术)和设备管理结合起来对数据中心关键设备进行集中监控、容量规划等集中管理。通过软件、硬件和传感器等,DCIM提供一个独立的管理平台,对数据中心IT设备和基础设施进行实时监控和管理。
3. 离散福镜像法:方程(MPIE)的矩量法是目前分析微带结构的主要方法之一.MPIE算法的核心是空域格林函数的求解.提出了二级离散复镜像法(DCIM)与表面波处理相结合的方法对空域格林函数进行计算.根据表面波的性质,提出了2种二级DCIM和表面波相结合的方案,分段比较两方案的...
4. 接口模块:Dominion 电脑接口模块 (DCIM),这是一种非常小的转接头,直接插入服务器的键盘、视频及鼠标连接端口。
5. DCIM(Data Center Integrated Management)数据中心集成管理
参考资料:DCIM-百度百科