3

ギャラリー内の画像に関連付けられているすべてのexif属性を一覧表示しようとしています。すべてのgetAttribute()はnullを返します。ExifInterfaceをデバッグおよび検査すると、有効なファイルがあり、「mAttributes」ノードを展開すると、「テーブル」には、探しているすべてのEXIFデータが含まれますが、「values」、「keySet」、および「valuescollection」が含まれます。 "はnullです。私がどこで間違っているのか考えていますか?

編集:おそらく問題は、ファイル名を取得する方法にありますか?より完全な全体像を示すために、以下のコードを更新しました。

//create an array of thumbnail IDs
String[] ids = {MediaStore.Images.Thumbnails._ID};
//this pulls the file locations
cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, ids, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);
colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);

//at this point we need to target the gridview.
GridView gallery = (GridView) findViewById(R.id.gridView1);
//borrowed an adapter provided in the tutorial at http://mihaifonoage.blogspot.com/2009/09/displaying-images-from-sd-card-in.html
gallery.setAdapter(new ImageAdapter(this));

//now we attach a listener to our gridview.
gallery.setOnItemClickListener(new OnItemClickListener(){
    public void onItemClick(AdapterView parent, View v, int position, long id)
    {
        String[] ids = {MediaStore.Images.Media.DATA};
        cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ids, null, null, null);
        colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToPosition(position);
        String image = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        ExifInterface clicked = null;
        try {
            clicked = new ExifInterface(image);
    } catch (IOException e) {
            // TODO Auto-generated catch block
        e.printStackTrace();
    }

        if(clicked==null)
        {
        Toast.makeText(getApplicationContext() , "We were not able to load the file." , Toast.LENGTH_LONG).show();
        }
        else
        {
        TextView tv = (TextView) findViewById(R.id.messageCenter);
        String message;
        message = "Latitude: " +  clicked.getAttribute(ExifInterface.TAG_GPS_LATITUDE)  + "\n";
        message += "Longitude: " + clicked.getAttribute(ExifInterface.TAG_GPS_LONGITUDE) + "\n";
        message += "Make: " + clicked.getAttribute(ExifInterface.TAG_MAKE) + "\n"; 
        message += "Model: " + clicked.getAttribute(ExifInterface.TAG_MODEL) + "\n";
        message += "Date/Time: " + clicked.getAttribute(ExifInterface.TAG_DATETIME) + "\n";
        message += "Flash: " + clicked.getAttribute(ExifInterface.TAG_FLASH) + "\n";
        message += "Flocal Length: " + clicked.getAttribute(ExifInterface.TAG_FOCAL_LENGTH) + "\n";
        message += "White Balance: " + clicked.getAttribute(ExifInterface.TAG_WHITE_BALANCE);

        tv.setText(message);
    }
}
});

実行時のクリックは次のようになります ここに画像の説明を入力してください

編集:表にリストされている値の呼び出しが機能することがわかりました。ただし、mAttributes.table。[0] .value.valueを展開すると、探している他の情報がchar配列にリストされます。なぜその情報が渡されないのですか?

4

2 に答える 2

2

画像の編集に使用するソフトウェアについては疑う必要があります。別の形式で保存するために使用するのは単なる「ビューア」であっても。EXIFを壊す人もいれば、完全に取り除く人もいます。また、EXIFが標準であると思われるかもしれませんが、タグの実装と命名の正確さはメーカーによって大きく異なります。EXIFをダンプするだけでなく、変更および標準化するために使用できるExifToolと呼ばれるツールがあります。たぶん、それをプロセスフローに埋め込んだり、コードから呼び出したりすることができます。

于 2012-09-29T19:01:39.287 に答える
1

一部の画像は正常に機能します。したがって、問題はデータであり、クラスやコードではありません。一部のデバイス/アプリケーションは、ExifInterfaceが解析できない非標準的な方法でexifデータをエンコードしていると思われます。

于 2012-08-24T11:33:02.460 に答える