posts - 189,comments - 115,trackbacks - 0


OPhone 3D 开发三篇参赛文章的源码

附件里是之前提交的一篇OPhone开发文章,http://www.ophonesdn.com/article/show/128,里面的代码。 
项目主页: http://www.ophonesdn.com/projectDetail/show/382 

-------------------------------------------------- 
顺便把另一篇的源码也放上来《OPhone 3D开发之炫酷封面效果》 ,http://www.ophonesdn.com/article/show/138 
-------------------------------------------------- 
第三篇的《OPhone 3D开发之射线拾取》 
http://www.ophonesdn.com/article/show/164 

因为貌似这里的工程好像无法上传代码,所以就把代码放在这里供大家下载。 
http://www.ophonesdn.com/forum/thread-832-1-1.html
http://www.china-pub.com/3500028

XML, Json response数据解析

XML, Json response数据解析

在对服务器进行请求后,我们往往还要获取服务器的返回结果,继续进行某些操作。这就要求我们要对response进行数据解析。而response的类型可能是xml或Json类型。下面对这两种文件进行数据解析示例: 

1.Json解析: 

try { 
            result = parseJSONResponse(data); 
            // check whether the result is an error 
            if (result instanceof JSONObject) { 
                JSONObject jso = (JSONObject)result; 
                if (jso.has("error_code")) { 
                    int errorCode = jso.getInt("error_code"); 
                    String errorMessage = jso.getString("error_msg"); 
                    JSONArray args = jso.getJSONArray("request_args"); 
                    Map<String, String> map = new HashMap<String, String>(); 
                    for (int i = 0; i < args.length(); i++) { 
                        JSONObject arg = args.getJSONObject(i); 
                        map.put(arg.getString("key"), arg.getString("value")); 
                    } 
//                    return result; 
                } 
                if (jso.has("XXXXXXXX")) { 
                
                //parse 
                } 
                if (jso.has("XXXXXXXX")) { 
                
                //parse 
                }if (jso.has("XXXXXXXX")) { 
                
                //parse 
                }......... 
                
                
            } 
        } catch (JSONException e) { 
            e.printStackTrace(); 
        } 
        return muResponse; 
    } 


    private static Object parseJSONResponse(String data) throws JSONException { 

        // TODO find some reliable way of creating appropriate JSON API class 
        if (data.startsWith("[")) { 
            return new JSONArray(data); 
        } else { 
            return new JSONObject(data); 
        } 
    } 

2. xml解析: 

private static void parseOpenTable(XmlPullParser pullParser, 
            String namespace, ListingDetailResult ret)throws XmlPullParserException, IOException { 
        int eventType = pullParser.next(); 
         
        OpenTable openTable = new OpenTable(); 
         
        while (true) { 
            if (eventType == XmlPullParser.END_DOCUMENT 
                    || (eventType == XmlPullParser.END_TAG && OPENTABLE 
                            .equalsIgnoreCase(pullParser.getName()))) { 
                break; 
            } 
            eventType = pullParser.next(); 
            if (eventType == XmlPullParser.START_TAG 
                    && RESTAURANT_ID.equalsIgnoreCase(pullParser.getName())) { 
                openTable.setRestaurantId(pullParser.nextText()); 
            } else if (eventType == XmlPullParser.START_TAG 
                    && RESERVATION_URL.equalsIgnoreCase(pullParser.getName())) { 
                openTable.setReservationUrl(pullParser.nextText()); 
            } else if (eventType == XmlPullParser.START_TAG 
                    && MOBILE_RESERVATION_URL.equalsIgnoreCase(pullParser.getName())) { 
                openTable.setMobileReservationUrl(pullParser.nextText()); 
            } 
             
        } 
        ret.setOpenTable(openTable); 
    }

怎样为多媒体文件生成缩略图:

怎样为多媒体文件生成缩略图 

1、Video 
对于视频,取第一帧作为缩略图,也就是怎样从filePath得到一个Bitmap对象。 
private Bitmap createVideoThumbnail(String filePath) { 
        Bitmap bitmap = null; 
        MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
        try { 
            retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); 
            retriever.setDataSource(filePath); 
            bitmap = retriever.captureFrame(); 
        } catch(IllegalArgumentException ex) { 
            // Assume this is a corrupt video file 
        } catch (RuntimeException ex) { 
            // Assume this is a corrupt video file. 
        } finally { 
            try { 
                retriever.release(); 
            } catch (RuntimeException ex) { 
                // Ignore failures while cleaning up. 
            } 
        } 
        return bitmap; 
    } 
Android提供了MediaMetadataRetriever,由JNI(media_jni)实现。 
看得出MediaMetadataRetriever主要有两个功能:MODE_GET_METADATA_ONLY和MODE_CAPTURE_FRAME_ONLY 
这里设mode为MODE_CAPTURE_FRAME_ONLY,调用captureFrame取得一帧。 
另外还有两个方法可以用: 
extractMetadata 提取文件信息,ARTIST、DATE、YEAR、DURATION、RATING、FRAME_RATE、VIDEO_FORMAT 
和extractAlbumArt 提取专辑信息,这个下面的音乐文件可以用到。 

2、Music 
对于音乐,取得AlbumImage作为缩略图,还是用MediaMetadataRetriever 
private Bitmap createAlbumThumbnail(String filePath) { 
        Bitmap bitmap = null; 
        MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
        try { 
            retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY); 
            retriever.setDataSource(filePath); 
            byte[] art = retriever.extractAlbumArt(); 
            bitmap = BitmapFactory.decodeByteArray(art, 0, art.length); 
        } catch(IllegalArgumentException ex) { 
        } catch (RuntimeException ex) { 
        } finally { 
            try { 
                retriever.release(); 
            } catch (RuntimeException ex) { 
                // Ignore failures while cleaning up. 
            } 
        } 
        return bitmap; 
    } 
retriever.extractAlbumArt()得到的是byte数组,还需要一步用BitmapFactory编码得到Bitmap对象。 

3、Image 
图片就很简单了 
        Bitmap bm = null; 
        Options op = new Options(); 
        op.inSampleSize = inSampleSize; 
        op.inJustDecodeBounds = false; 
        bm = BitmapFactory.decodeFile(mFile.getPath(), op); 
能直接得到Bitmap对象,把图片缩小到合适大小就OK。 
同样上面的Video和Music,retrive到Bitmap后也需要缩小处理。 

bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法:

bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法

★android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget 

● 主要是加上这段: 
BitmapFactory.Options options = new BitmapFactory.Options(); 
                options.inSampleSize = 2; 

● eg1:(通过Uri取图片) 
private ImageView preview; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
                    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一 
                    Bitmap bitmap = BitmapFactory.decodeStream(cr 
                            .openInputStream(uri), null, options); 
                    preview.setImageBitmap(bitmap); 
以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。 
● eg2:(通过路径去图片) 
private ImageView preview; 
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg"; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
                options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一 
                        Bitmap b = BitmapFactory.decodeFile(fileName, options); 
                        preview.setImageBitmap(b); 
                        filePath.setText(fileName); 

★Android 还有一些性能优化的方法: 
●  首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配 

●  基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。Android123提示游戏开发者,这点比较有意思的是Google推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的。 

●  图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap可以使用下面的方式,如 

if(bitmapObject.isRecycled()==false) //如果没有回收   
         bitmapObject.recycle();    

●  目前系统对动画支持比较弱智对于常规应用的补间过渡效果可以,但是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,目前Android系统仅能预览GIF的第一帧,可以借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。 

● 对于大多数Android手机没有过多的物理按键可能我们需要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。 

Android堆内存也可自己定义大小 

   对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了上次Android开发网提到的 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例: 

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。 

优化Dalvik虚拟机的堆内存分配 

对于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:   private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);即可。
另外还可以用try { 
                                  ```````` 
                                }catch (OutOfMemoryError e) { 
                                        e.printStackTrace(); 
                                        // TODO: handle exception 
                                } 
来捕获OOE错误。

posted on 2010-09-09 15:13 MEYE 阅读(2145) 评论(0)  编辑  收藏 所属分类: Android3D

只有注册用户登录后才能发表评论。


网站导航: