使用ExifInterface时出现的Android错误

25

我正在尝试检查位图的方向,如果需要就翻转它,但应用代码时出现错误。以下是我使用ExifInterface尝试翻转图像的代码:

我正在尝试检查位图的方向,如果需要就翻转它,但在应用代码时出现了错误。这是我使用ExifInterface尝试翻转图像的代码:

@RequiresApi(api = Build.VERSION_CODES.N)
    public void flipping(Bitmap b)
    {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.JPEG,100, bos);
        byte[] bitmapdata = bos.toByteArray();
        ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata);
        try {

            ExifInterface exif = new ExifInterface(bs);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);
            switch(orientation) {

                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotateImage(b, 90);
                    break;

                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotateImage(b, 180);
                    break;

                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotateImage(b, 270);
                    break;

                case ExifInterface.ORIENTATION_NORMAL:

                default:
                    break;
            }

            encoding();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Bitmap rotateImage(Bitmap source, float angle) {
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                matrix, true);
    }

这里是错误提示:

java.lang.NoSuchMethodError: No direct method <init>(Ljava/io/InputStream;)V in class Landroid/media/ExifInterface; or its super classes (declaration of 'android.media.ExifInterface' appears in /system/framework/framework.jar)
                                                                       at com.sara.image_test.MainActivity.flipping(MainActivity.java:181)
                                                                       at com.sara.image_test.MainActivity.onActivityResult(MainActivity.java:66)
                                                                       at android.app.Activity.dispatchActivityResult(Activity.java:7165)
                                                                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4994)
                                                                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)
                                                                       at android.app.ActivityThread.access$1600(ActivityThread.java:229)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:7325)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
4个回答

55

针对 AndroidX 使用


androidx.exifinterface.media.ExifInterface

Import this dependency in build.gradle:

implementation 'androidx.exifinterface:exifinterface:1.3.2'

4
谢谢。官方文档很差,没有提到依赖关系。 - Muhammad Babar
3
最新版本可在 https://developer.android.com/jetpack/androidx/releases/exifinterface 上获取。 - Francis

26

你正在尝试使用 android.media.ExifInterface。在Android 7.0+ (API Level 24)上,该类是安全可用的,并且具有一个接受 InputStream 的构造函数。显然,您正在旧设备上运行应用程序,这会导致两个问题:

  1. 旧设备将没有该构造函数

  2. ExifInterface 在旧设备上存在安全漏洞,会使您的应用程序面临恶意软件攻击风险

请改用 android.support.media.ExifInterface。它来自支持库(特别地,是 com.android.support:exifinterface)。它提供了一个接受 InputStream 的构造函数,并可在所有支持的 Android 版本上工作。此外,它可以绕过旧设备上的安全漏洞。


谢谢,现在没有错误了。但是对于所有的图像,它始终返回0。 - Saleh Refaai
这并不奇怪,因为Bitmap没有任何EXIF头。当您从任何地方加载Bitmap时,已经丢弃了任何EXIF数据。在数据的原始来源上使用ExifInterface,而不是Bitmap - CommonsWare

14

将以下内容添加到您的build.gradle文件中

compile "com.android.support:exifinterface:25.1.0"

对我而言,它起作用了。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接