Android 如何将ExiFinInterface与流或URI一起使用

Android 如何将ExiFinInterface与流或URI一起使用,android,stream,orientation,uri,exif,Android,Stream,Orientation,Uri,Exif,我正在编写一个应用程序,它可以从Android的“Share via”菜单发送照片URI 您得到的URI类型是content://media/external/images/media/556但是ExiFinInterface需要标准文件名。那么如何读取该文件的exif数据(我只需要方向)?以下是我的(非工作)代码: 感谢您的任何帮助(除了“您必须编写自己的ExiFinInterface类”) 我在Facebook Android SDK示例中随机找到了答案。我还没有测试过,但看起来应该可以用。

我正在编写一个应用程序,它可以从Android的“Share via”菜单发送照片URI

您得到的URI类型是
content://media/external/images/media/556
但是
ExiFinInterface
需要标准文件名。那么如何读取该文件的exif数据(我只需要方向)?以下是我的(非工作)代码:


感谢您的任何帮助(除了“您必须编写自己的ExiFinInterface类”)

我在Facebook Android SDK示例中随机找到了答案。我还没有测试过,但看起来应该可以用。代码如下:

public static int getOrientation(Context context, Uri photoUri) {
    /* it's on the external media. */
    Cursor cursor = context.getContentResolver().query(photoUri,
            new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null);

    int result = -1;
    if (null != cursor) {
        if (cursor.moveToFirst()) {
            result = cursor.getInt(0);
        }
        cursor.close();
    }

    return result;
}

通过在build.gradle文件中导入support ExifInterface,可以使用文件名字符串或InputStream获取ExifInterface:

compile 'com.android.support:exifinterface:26.1.0'
然后:

private getExifInterfaceFromUri(Uri uri) throws IOException{
    FileInputStream fi = new FileInputStream(uri.getPath());

    return new ExifInterface(stream);
}

请记住,在Android中有多种Uri类型,您可能需要使用内容解析器和其他方法从Uri获取真实路径。

您是否尝试了新的ExiFinInterface(Uri.getPath());此外,您还可以查询内容uri以获得方向。hello@Timmm,我已经厌倦了这段代码,它用于使用photouri查找图像的方向。但游标正在抛出nullpointer异常,可能是它没有获取photouri。您能为它提出任何解决方案吗?@timmm在上面的代码中,您忘记了关闭光标-这是一个内存leak@GregoryFacebook忘了!谢谢你修改代码。顺便说一句,这就是垃圾收集是垃圾的原因-您不能使用RAII。请注意,这返回的是以度为单位的文字方向,而不是像ExifInterface那样表示值的枚举。@JustinMeiners我使用的是ExifInterface,StrictMode是拾取DetectLekedClosable对象并终止我的应用程序(Penaltydath)
private getExifInterfaceFromUri(Uri uri) throws IOException{
    FileInputStream fi = new FileInputStream(uri.getPath());

    return new ExifInterface(stream);
}