Android5.0中的android.graphics.Bitmap类的字段mNativeBitmap变为long型

2015年02月27日 Android 暂无评论 阅读5649次

Android5.0中的android.graphics.Bitmap类的字段mNativeBitmap类型变为long型

在APP中处理图片时,有一段代码逻辑是在日志中打印所处理的bitmap的当前ID,用的是得到Bitmap对象的NativeID的方法。
根据反射机制,在android.graphics.Bitmap类的源码中看到有如下定义:

    /**
     * Note:  mNativeBitmap is used by FaceDetector_jni.cpp
     * Don't change/rename without updating FaceDetector_jni.cpp
     * 
     * @hide
     */
    public final int mNativeBitmap;
所以写了下面一个共通方法:

public static int getBitmapNativeId(Bitmap bitmap) {
        if (bitmap == null)
            return 0;
        Field nativeBitmap = null;

        try {
            nativeBitmap = Bitmap.class
                    .getDeclaredField("mNativeBitmap");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        if (nativeBitmap == null)
            return 0;
        try {
            return nativeBitmap.getInt(bitmap);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return 0;
    }
在已经升级到Android5.0.2的Nexus7Tablet上测试,虽然没看到神马错误现象,但后台日志中没有得到bitmap的ID,并且输出了下面的错误日志
02-27 15:01:00.645: W/System.err(31762): java.lang.IllegalArgumentException: Invalid primitive conversion from long to int
02-27 15:01:00.646: W/System.err(31762):    at java.lang.reflect.Field.getInt(Native Method)
02-27 15:01:00.646: W/System.err(31762):    at java.lang.reflect.Field.getInt(Field.java:460)
02-27 15:01:00.646: W/System.err(31762):    at net.jileniao.android.util.BitmapUtils.getBitmapNativeId(BitmapUtils.java:510)
02-27 15:01:00.647: W/System.err(31762):    at net.jileniao.android.util.DecodeUtils.LogDecode(DecodeUtils.java:292)
02-27 15:01:00.647: W/System.err(31762):    at net.jileniao.android.util.DecodeUtils.requestDecode(DecodeUtils.java:64)
02-27 15:01:00.647: W/System.err(31762):    at net.jileniao.android.logic.RequestBitmapTask.getCompressedBitmap(RequestBitmapTask.java:151)
02-27 15:01:00.647: W/System.err(31762):    at net.jileniao.android.logic.RequestBitmapTask.doInBackground(RequestBitmapTask.java:48)
02-27 15:01:00.647: W/System.err(31762):    at net.jileniao.android.logic.RequestBitmapTask.doInBackground(RequestBitmapTask.java:1)
02-27 15:01:00.647: W/System.err(31762):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
02-27 15:01:00.647: W/System.err(31762):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-27 15:01:00.647: W/System.err(31762):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-27 15:01:00.647: W/System.err(31762):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-27 15:01:00.647: W/System.err(31762):    at java.lang.Thread.run(Thread.java:818)

根据日志可以很容易看到是Bitmap类中的mNativeBitmap类型转化出错类。
查看Android5.0的android.graphics.Bitmap类的源码;发现mNativeBitmap类型已经不是int,而是变为long型了。
    /**
     * Note:  mNativeBitmap is used by FaceDetector_jni.cpp
     * Don't change/rename without updating FaceDetector_jni.cpp
     * 
     * @hide
     */
    public final long mNativeBitmap;
因此,getBitmapNativeId(Bitmap)的代码改为下面这样就没问题了。

public static long getBitmapNativeId(Bitmap bitmap) {
        if (bitmap == null)
            return 0L;
        Field nativeBitmap = null;

        try {
            nativeBitmap = Bitmap.class
                    .getDeclaredField("mNativeBitmap");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        if (nativeBitmap == null)
            return 0L;
        try {
            return nativeBitmap.getLong(bitmap);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return 0L;
    }

分享本文至:

WRITTEN BY

avatar
本文标签:android5.0Bitmap
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

欢迎留言




用户登录

sitemap