0

我是 android 和 java 编程的新手,请详细解释我应该从这里做什么。我想下载图像并将其存储在SharedPreferences. 任何变量都可以,只要您还可以告诉我如何将图像输出为imageview. 我读过类似的主题,但我无法完全理解,也不知道如何处理这些主题。

这是我的代码,类扩展 AsyncTask -> onPreExecute:

protected void onPostExecute(String result) {
    SharedPreferences pref = getApplicationContext().getSharedPreferences(
            "athan", MODE_PRIVATE);
    Editor editor = pref.edit();
    try{
        JSONArray jArray = new JSONArray(result);
        for(int i=0;i<jArray.length();i++)
            {
                JSONObject json_data = jArray.getJSONObject(i);
                editor.putString("fstime"+i, json_data.getString("time"));
                editor.putString("fspname"+i, json_data.getString("postname"));
                    //this is what i want to modify:
                //editor.putString("fsfile"+i, json_data.getString("file"));
                    //"json_data.getString("file")" gives a value of string of link to the image
                    //so instead of saving the link, i want to download the image and store in in SharedPreference instead.
                    //like editor.putImage("fsfile"+i, json_data.getImage("file"));
            }

        editor.putBoolean("fileshares", true);
        editor.commit();
        }
    catch(JSONException e)
    {
        Log.e("Athan", "Error parsing data "+e.toString());
    }
    fileshareview();
}

}

编辑:所以我做了一些研究,发现:

为此,我必须: 1. 将我的 json_data 给出的字符串转换为 URL 2. 使用此 URL 将图像转换为位图 3. 使用 Base64 编码将位图转换为字符串 4. 将编码的字符串存储到共享偏好。

然后显示图像我必须: 1. 将编码图像恢复回位图 2. 使用位图查看 ImageView

我的问题是,我一直在使用分散在这里的代码,但仍然没有运气,有人可以帮我理解如何做到这一点吗?我的手机总是收到 Logcat 消息“Grow Heap”。我知道这不是一个好计划,但为了创建“离线访问”,我需要共享首选项。

4

2 回答 2

1

下载图像位图:

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(imgUrl); // url as string

HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
Bitmap result = streamToBitmap(is);
is.close();

创建目录来存储图像:

private void createFile() {
    File file = new File(getDir());
    file.mkdirs(); // Create directory
    try {
        File file1 = new File(getFileDir());
        file1.createNewFile(); // Create file in the same directory
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// Get directory path. The directory is created in variable location
private String getDir() {
    return Environment.getExternalStorageDirectory() + File.separator
            + DIRNAME;
}

// Get file path. The path is inside the previously created directory
private String getFileDir() {
    return Environment.getExternalStorageDirectory() + File.separator
            + DIRNAME + File.separator + FILENAME; // "myPic.bmp"
}

保存图片:

FileOutputStream fos = new FileOutputStream(getFileDir());
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 85, outstream);
byte[] byteArray = outstream.toByteArray();

stream.write(byteArray);
stream.close();

主线程不应该下载图像文件,而是创建一个Thread对象或使用 android AsyncTask

图像存储到设备内存后,您只需调用getFileDir()方法保存文件位置,并将结果保存到共享内存中

于 2013-09-08T08:53:34.423 回答
0
Intent intent = new Intent();  
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(mylink), "image/*");  
startActivity(intent);

这段代码就像魅力一样工作..

于 2013-09-22T10:22:45.747 回答