保存图片到本地目录和获取

本文介绍了一种在Android应用中从网络下载图片,并将其保存到本地存储的方法。通过使用HttpURLConnection连接网络资源,将图片数据读取到输入流中,并最终写入到外部存储上。同时展示了如何在应用界面上显示这些图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<code class="hljs java has-numbering">因为是对互联网和内存操作,所以我们要添加如下权限:

<span class="hljs-comment">//代码如下所示:</span>

<span class="hljs-keyword">package</span> com.itfom.getpicfromnet;
<span class="hljs-keyword">import</span> java.io.File;
<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.io.InputStream;
<span class="hljs-keyword">import</span> java.net.HttpURLConnection;
<span class="hljs-keyword">import</span> java.net.URL;
<span class="hljs-keyword">import</span> android.annotation.SuppressLint;
<span class="hljs-keyword">import</span> android.app.Activity;
<span class="hljs-keyword">import</span> android.graphics.BitmapFactory;
<span class="hljs-keyword">import</span> android.os.Bundle;
<span class="hljs-keyword">import</span> android.os.Environment;
<span class="hljs-keyword">import</span> android.os.Handler;
<span class="hljs-keyword">import</span> android.os.Message;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.view.View.OnClickListener;
<span class="hljs-keyword">import</span> android.widget.Button;
<span class="hljs-keyword">import</span> android.widget.ImageView;
<span class="hljs-annotation">@SuppressLint</span>(<span class="hljs-string">"HandlerLeak"</span>)
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
    <span class="hljs-keyword">private</span> ImageView iv_pic;
    <span class="hljs-keyword">private</span> Button btn_get;
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_get = (Button) findViewById(R.id.btn_get);
        iv_pic = (ImageView) findViewById(R.id.iv_img);
        <span class="hljs-comment">//设置监听事件</span>
        btn_get.setOnClickListener(<span class="hljs-keyword">new</span> OnClickListener() {
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View v) {
                <span class="hljs-comment">//开启子线程</span>
                <span class="hljs-keyword">new</span> Thread(){
                    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
                        <span class="hljs-keyword">try</span> {
                            String urlPath = <span class="hljs-string">"http://pic7.nipic.com/20100607/4791134_172835008083_2.jpg"</span>;
                            URL url = <span class="hljs-keyword">new</span> URL(urlPath);
                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                            conn.setConnectTimeout(<span class="hljs-number">6</span>*<span class="hljs-number">1000</span>);  <span class="hljs-comment">// 注意要设置超时,设置时间不要超过10秒,避免被android系统回收</span>
                            <span class="hljs-keyword">if</span> (conn.getResponseCode() != <span class="hljs-number">200</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"请求url失败"</span>);
                            InputStream inSream = conn.getInputStream();
                            <span class="hljs-comment">//把图片保存到项目的根目录</span>
                            readAsFile(inSream, <span class="hljs-keyword">new</span> File(Environment.getExternalStorageDirectory()+<span class="hljs-string">"/"</span>+<span class="hljs-string">"test.jpg"</span>));
                            Message msg=<span class="hljs-keyword">new</span> Message();
                            msg.what=<span class="hljs-number">0</span>;
                            handler.sendMessage(msg);
                        } <span class="hljs-keyword">catch</span> (Exception e) {
                            e.printStackTrace();
                        }
                    };
                }.start();
            }
        });
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">readAsFile</span>(InputStream inSream, File file) <span class="hljs-keyword">throws</span> Exception{
        FileOutputStream outStream = <span class="hljs-keyword">new</span> FileOutputStream(file);
        <span class="hljs-keyword">byte</span>[] buffer = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];
        <span class="hljs-keyword">int</span> len = -<span class="hljs-number">1</span>;
        <span class="hljs-keyword">while</span>( (len = inSream.read(buffer)) != -<span class="hljs-number">1</span> ){
            outStream.write(buffer, <span class="hljs-number">0</span>, len);
        }
        outStream.close();
        inSream.close();
    }
    <span class="hljs-comment">//创建Handler</span>
    Handler handler=<span class="hljs-keyword">new</span> Handler(){
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(android.os.Message msg) {
            <span class="hljs-keyword">if</span>(msg.what==<span class="hljs-number">0</span>){
                <span class="hljs-comment">//开始绑定数据</span>
                iv_pic.setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+<span class="hljs-string">"/test.jpg"</span>));  <span class="hljs-comment">// 获取保存到根目录的图片并展示</span>
            }
        };
    };
}</code> <ul class="pre-numbering" style=""></ul>
<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
     * 保存到本地文件
     *<span class="hljs-javadoctag"> @param</span> inSream
     *<span class="hljs-javadoctag"> @param</span> file
     *<span class="hljs-javadoctag"> @throws</span> Exception
     * readAsFile(inSream, new File(Environment.getExternalStorageDirectory()+"/"+"test.jpg"));
     * iv_pic.setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/test.jpg")); 获取
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">readAsFile</span>(InputStream inSream, File file) <span class="hljs-keyword">throws</span> Exception{
        FileOutputStream outStream = <span class="hljs-keyword">new</span> FileOutputStream(file);
        <span class="hljs-keyword">byte</span>[] buffer = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];
        <span class="hljs-keyword">int</span> len = -<span class="hljs-number">1</span>;
        <span class="hljs-keyword">while</span>( (len = inSream.read(buffer)) != -<span class="hljs-number">1</span> ){
            outStream.write(buffer, <span class="hljs-number">0</span>, len);
        }
        outStream.close();
        inSream.close();
    }</code> 

权限:

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.READ_EXTERNAL_STORAGE"</span>></span><span class="hljs-tag"></<span class="hljs-title">uses-permission</span>></span>  
<span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.WRITE_EXTERNAL_STORAGE"</span>></span><span class="hljs-tag"></<span class="hljs-title">uses-permission</span>></span></code>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值