Android简单位图读取



我正试图从web服务器读取JSON文件,并将它们转换为列表视图的位图图像。问题是我尝试了这个例子,但试图创建一个文件系统目录:;resolveUri在坏位图uri上失败";在ListView上放置图像时;这可能是一个不正确的路径/技术?我收到了一个malformedURI执行选项,当我尝试仅使用图像的常规JSON字符串时,我收到了badURI异常。任何关于如何让JSON提要正确解码的想法都将不胜感激。JSON提要如下:http://shipstudent.com/complaint_desk/androidcentralwall.php如果您想查看个人资料图片标签。如果你需要更多信息,请告诉我。

public void updateJSONdata() {

            mCommentList = new ArrayList<HashMap<String, String>>();
            JSONParser jParser = new JSONParser();
            JSONObject json = jParser.getJSONFromUrl(READ_COMMENTS_URL);
            try {
                allPosts = json.getJSONArray(TAG_POSTS);
                // looping through all posts according to the json object returned
                for (int i = 0; i < allPosts.length(); i++) {
                    JSONObject c = allPosts.getJSONObject(i);
                    // gets the content of each tag
                    String title = c.getString(TAG_TITLE);
                    String content = c.getString(TAG_MESSAGE);
                    String username = c.getString(TAG_USERNAME);
                    File sdCard = Environment.getExternalStorageDirectory();
                    String profile_picture = c.getString(loadImageFromWebOperations(TAG_PROFILE_PICTURE,sdCard.getAbsolutePath() + "/dir1/dir2"));
                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_TITLE, title);
                    map.put(TAG_MESSAGE, content);
                    map.put(TAG_USERNAME, username);
                    map.put(TAG_PROFILE_PICTURE, profile_picture);
                    // adding HashList to ArrayList
                    mCommentList.add(map);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        @SuppressWarnings("resource")
        public static String loadImageFromWebOperations(String url, String path) {
            try {
                InputStream is = (InputStream) new URL(url).getContent();
                System.out.println(path);
                File f = new File(path);
                f.createNewFile();
                FileOutputStream fos = new FileOutputStream(f);
                try {
                    byte[] b = new byte[100];
                    int l = 0;
                    while ((l = is.read(b)) != -1)
                        fos.write(b, 0, l);
                } catch (Exception e) {
                }
                return f.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Exc=" + e);
                return null;
            }
        }

Logcat(如果不使用位图/文件解码方法时有用):

09-07 20:43:08.877: I/Adreno-EGL(1497): <qeglDrvAPI_eglInitialize:381>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_KK_2.7_RB1.04.04.00.007.018_msm8960_KK_2.7_RB1_CL3869936_release_AU (CL3869936)
09-07 20:43:08.877: I/Adreno-EGL(1497): OpenGL ES Shader Compiler Version: 17.01.10.SPL
09-07 20:43:10.558: W/System.err(1497):     at com.rynovation.kline.mainViewController.updateJSONdata(mainViewController.java:126)
09-07 20:43:10.558: W/System.err(1497):     at com.rynovation.kline.mainViewController$LoadComments.doInBackground(mainViewController.java:225)
09-07 20:43:10.558: W/System.err(1497):     at com.rynovation.kline.mainViewController$LoadComments.doInBackground(mainViewController.java:1)
09-07 20:44:12.034: I/Adreno-EGL(2592): <qeglDrvAPI_eglInitialize:381>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_KK_2.7_RB1.04.04.00.007.018_msm8960_KK_2.7_RB1_CL3869936_release_AU (CL3869936)
09-07 20:44:12.034: I/Adreno-EGL(2592): OpenGL ES Shader Compiler Version: 17.01.10.SPL
09-07 20:44:13.355: E/BitmapFactory(2592): Unable to decode stream: java.io.FileNotFoundException: /https:/shipstudent.com/complaint_desk/appphotos/owl.jpeg: open failed: ENOENT (No such file or directory)
09-07 20:44:13.355: I/System.out(2592): resolveUri failed on bad bitmap uri: https://shipstudent.com/complaint_desk/appphotos/owl.jpeg
09-07 20:44:13.425: E/BitmapFactory(2592): Unable to decode stream: java.io.FileNotFoundException: /https:/shipstudent.com/complaint_desk/appphotos/owl.jpeg: open failed: ENOENT (No such file or directory)
09-07 20:44:13.425: I/System.out(2592): resolveUri failed on bad bitmap uri: https://shipstudent.com/complaint_desk/appphotos/owl.jpeg
09-07 20:44:13.445: E/BitmapFactory(2592): Unable to decode stream: java.io.FileNotFoundException: /https:/shipstudent.com/animal/appphotos/978321177.jpg: open failed: ENOENT (No such file or directory)
09-07 20:44:13.445: I/System.out(2592): resolveUri failed on bad bitmap uri: https://shipstudent.com/animal/appphotos/978321177.jpg
09-07 20:44:13.455: E/BitmapFactory(2592): Unable to decode stream: java.io.FileNotFoundException: /https:/shipstudent.com/animal/appphotos/978321177.jpg: open failed: ENOENT (No such file or directory)
09-07 20:44:13.455: I/System.out(2592): resolveUri failed on bad bitmap uri: https://shipstudent.com/animal/appphotos/978321177.jpg
09-07 20:44:13.475: E/BitmapFactory(2592): Unable to decode stream: java.io.FileNotFoundException: /https:/shipstudent.com/animal/appphotos/978321177.jpg: open failed: ENOENT (No such file or directory)
09-07 20:44:13.475: I/System.out(2592): resolveUri failed on bad bitmap uri: https://shipstudent.com/animal/appphotos/978321177.jpg

如果我尝试上面的:

String profile_picture = c.getString(loadImageFromWebOperations(TAG_PROFILE_PICTURE.substring(0),sdCard.getAbsolutePath() + "/dir1/dir2"));

我得到一个未找到的协议logcat:

09-07 21:52:42.585: I/System.out(18987): Exc=java.net.MalformedURLException: Protocol not found: profile_picture
09-07 21:52:42.585: W/System.err(18987): org.json.JSONException: No value for null
09-07 21:52:42.595: W/System.err(18987):    at org.json.JSONObject.get(JSONObject.java:355)
09-07 21:52:42.595: W/System.err(18987):    at org.json.JSONObject.getString(JSONObject.java:515)
09-07 21:52:42.595: W/System.err(18987):    at com.rynovation.kline.mainViewController.updateJSONdata(mainViewController.java:126)
09-07 21:52:42.595: W/System.err(18987):    at com.rynovation.kline.mainViewController$LoadComments.doInBackground(mainViewController.java:228)
09-07 21:52:42.595: W/System.err(18987):    at com.rynovation.kline.mainViewController$LoadComments.doInBackground(mainViewController.java:1)
09-07 21:52:42.595: W/System.err(18987):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
09-07 21:52:42.595: W/System.err(18987):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-07 21:52:42.595: W/System.err(18987):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-07 21:52:42.595: W/System.err(18987):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-07 21:52:42.595: W/System.err(18987):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-07 21:52:42.595: W/System.err(18987):    at java.lang.Thread.run(Thread.java:841)

我有一个简单的ImageLoader.class,你可以尝试

   public class ImageLoader {
   public static final String TAG = ImageLoader.class.getSimpleName(); 
     private ImageLoaderEngine engine;
    public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,
                         ImageLoadingListener listener) {
    checkConfiguration();
    if (imageAware == null) {
        throw new IllegalArgumentException(ERROR_WRONG_ARGUMENTS);
    }
    if (listener == null) {
        listener = emptyListener;
    }
    if (options == null) {
        options = configuration.defaultDisplayImageOptions;
    }
    if (TextUtils.isEmpty(uri)) {
        engine.cancelDisplayTaskFor(imageAware);
        listener.onLoadingStarted(uri, imageAware.getWrappedView());
        if (options.shouldShowImageForEmptyUri()) {
            imageAware.setImageDrawable(options.getImageForEmptyUri(configuration.resources));
        } else {
            imageAware.setImageDrawable(null);
        }
        listener.onLoadingComplete(uri, imageAware.getWrappedView(), null);
        return;
    }
    ImageSize targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());
    String memoryCacheKey = MemoryCacheUtil.generateKey(uri, targetSize);
    engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);
    listener.onLoadingStarted(uri, imageAware.getWrappedView());
    Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);
    if (bmp != null && !bmp.isRecycled()) {
        if (configuration.writeLogs) L.d(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey);
        if (options.shouldPostProcess()) {
            ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey, options, listener, engine
                    .getLockForUri(uri));
            ProcessAndDisplayImageTask displayTask = new ProcessAndDisplayImageTask(engine, bmp, imageLoadingInfo, options
                    .getHandler());
            if (options.isSyncLoading()) {
                displayTask.run();
            } else {
                engine.submit(displayTask);
            }
        } else {
            bmp = options.getDisplayer().display(bmp, imageAware, LoadedFrom.MEMORY_CACHE);
            listener.onLoadingComplete(uri, imageAware.getWrappedView(), bmp);
        }
    } else {
        if (options.shouldShowImageOnLoading()) {
            imageAware.setImageDrawable(options.getImageOnLoading(configuration.resources));
        } else if (options.isResetViewBeforeLoading()) {
            imageAware.setImageDrawable(null);
        }
        ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey, options, listener, engine
                .getLockForUri(uri));
        LoadAndDisplayImageTask displayTask = new LoadAndDisplayImageTask(engine, imageLoadingInfo, options
                .getHandler());
        if (options.isSyncLoading()) {
            displayTask.run();
        } else {
            engine.submit(displayTask);
        }
    }
}
    public void displayImage(String uri, ImageView imageView) {
    displayImage(uri, new ImageViewAware(imageView), null, null);
    }
}

//

public static ImageSize defineTargetSizeForView(ImageAware imageAware, ImageSize maxImageSize) {
    int width = imageAware.getWidth();
    if (width <= 0) width = maxImageSize.getWidth();
    int height = imageAware.getHeight();
    if (height <= 0) height = maxImageSize.getHeight();
    return new ImageSize(width, height);
}

在getView 上的适配器类listview中调用此meethod

    ImageLoader.getInstance().displayImage(mData.get(position).getImage0(), holder.photo);

最新更新