图像未保存到SD卡中的Android设备

时间:2014-07-11 06:53:18

标签: android

package com.lociiapp;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;

import com.androidquery.AQuery;
import com.example.imageslideshow.R;

public class recciverfullimageActivty extends Activity {
    String reccvierid;
    Context context;
    ImageView recciverimage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Intent myintent = getIntent();
        reccvierid = myintent.getStringExtra("reccvierid");
        recciverimage = (ImageView) findViewById(R.id.recciverImage);
        String myfinalpathare = reccvierid;
        Toast.makeText(getApplicationContext(), reccvierid, 10000).show();
        String imagepathe = "http://api.lociiapp.com/TransientStorage/"
                + myfinalpathare + ".jpg";

        try {
            saveImage(imagepathe);

            Log.e("****************************", "Sucess");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void saveImage(String urlPath) throws Exception {
        String fileName = "test.jpg";
        File folder = new File("/sdcard/LociiImages/");
        // have the object build the directory structure, if needed.
        folder.mkdirs();

        final File output = new File(folder, fileName);
        if (output.exists()) {
            output.delete();
        }

        InputStream stream = null;
        FileOutputStream fos = null;
        try {

            URL url = new URL(urlPath);
            stream = url.openConnection().getInputStream();
            // InputStreamReader reader = new InputStreamReader(stream);
            DataInputStream dis = new DataInputStream(url.openConnection()
                    .getInputStream());
            byte[] fileData = new byte[url.openConnection().getContentLength()];
            for (int x = 0; x < fileData.length; x++) { // fill byte array with
                                                        // bytes from the data
                                                        // input stream
                fileData[x] = dis.readByte();

            }
            dis.close();
            fos = new FileOutputStream(output.getPath());
            fos.write(fileData);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

这是我的代码我正在尝试保存来自服务器的Image我们有Image Url。当我运行此代码然后文件夹正在创建Sd卡但图像不下载保存在Sd护理请帮助,并告诉我在哪里做错了。

2 个答案:

答案 0 :(得分:2)

您的清单应如下:

A。确保您拥有正确的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" /> 


B. 将网络和文件IO逻辑移至非UI线程

new AsyncTask<Params, Progress, Result>() {
    @Override protected Result doInBackground() {
         saveImage(imagepathe);
    } 
    @Override protected void onPostExecute(String result) {
        // update UI here
    }
}.execute(params);


C。 当时不要读取一个字节。这可能不是您问题的根源,但它 确实使你的解决方案很多比它慢:

而不是:

for(;;)  {
   fileData[x] = dis.readByte();
}

这样做:

URL u = new URL(url);
URLConnection connection = u.openConnection();
byte[] buffer = new byte[connection.getContentLength()];
stream.readFully(buffer); // <------------- read all at once
stream.close();



D。最后,考虑使用Picasso来完成这项工作:

Picasso.with(context)
  .load(url)
  .resize(50, 50)
  .centerCrop()
  .into(imageView)


现在你只是不需要写那么多代码来得到你要去...

答案 1 :(得分:1)

试试这个..

如下所示,而不是saveImage(imagepathe);

myAsyncTask myWebFetch = new myAsyncTask();
myWebFetch.execute();

myAsyncTask.class

class myAsyncTask extends AsyncTask<Void, Void, Void>    {

    public ProgressDialog dialog;
    myAsyncTask()   
    {
        dialog = new ProgressDialog(webview.this);
        dialog.setMessage("Loading image...");
        dialog.setCancelable(true);
        dialog.setIndeterminate(true);
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        dialog.dismiss();

    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog.show();
    }
    protected Void doInBackground(Void... arg0) {
       try {

            InputStream stream = null;
            URL url = new URL("http://api.lociiapp.com/TransientStorage/286.jpg");
            URLConnection connection = url.openConnection();
            try {
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                httpConnection.setRequestMethod("GET");
                httpConnection.connect();

                File SDCardRoot = Environment.getExternalStorageDirectory();
                File myDir = new File(SDCardRoot + "/LociiImages");
                myDir.mkdirs();

                File file = new File(myDir,"test.jpg");

                FileOutputStream fileOutput = new FileOutputStream(file);

                if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    stream = httpConnection.getInputStream();
                }

                byte[] buffer = new byte[1024];
                int bufferLength = 0; 

                while ( (bufferLength = stream.read(buffer)) > 0 ) {
                    fileOutput.write(buffer, 0, bufferLength);
                }
                fileOutput.close();

            } catch (Exception ex) {
                ex.printStackTrace();
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }  
}

修改

String imagePath = Environment.getExternalStorageDirectory().toString() + "/LociiImages/test.jpg";
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
imageview.setImageBitmap(bitmap);