2017-10-22 18 views
0

誰かがこの問題を教えてくれますか? ギャラリーの先頭に画像が表示されるようにします。 私は自分のコードで何を変更する必要がありますか?Android:画像はギャラリーの最後に保存されます

OutputStream fOut = null; 
try { 
    String path = getFilesDir().getPath(); 
    File file = new File(path, "LT-IMG-"+ts+".jpg"); 
    fOut = new FileOutputStream(file); 
    Bitmap bitmap = ((BitmapDrawable)photoView.getDrawable()).getBitmap(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
    fOut.flush(); 
    fOut.close(); 

    MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 

} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

問題(エラーメッセージはである何:あなたはそれが最初または任意の他のメタデータに表示されますので、日付を変更したい場合は、下記のコード(SKのCortesy、samkirton)を参照してくださいstackstraceなど)をコードと一緒に使用できますか?また、コードを提供する際には、最小限の、しかし完全で検証可能なものを提供してください。 – kalabalik

答えて

0
MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription); 

元のコードでは、ギャラリーの最後に画像が追加されます。

https://gist.github.com/samkirton/0242ba81d7ca00b475b9

/** 
* Android internals have been modified to store images in the media 
folder with * the correct date meta data * @author samuelkirton*/ 
public class CapturePhotoUtils { 

/** 
* A copy of the Android internals insertImage method, this method populates the 
* meta data with DATE_ADDED and DATE_TAKEN. This fixes a common problem where media 
* that is inserted manually gets saved at the end of the gallery (because date is not populated). 
* @see android.provider.MediaStore.Images.Media#insertImage(ContentResolver, Bitmap, String, String) 
*/ 
public static final String insertImage(ContentResolver cr, 
     Bitmap source, 
     String title, 
     String description) { 

    ContentValues values = new ContentValues(); 
    values.put(Images.Media.TITLE, title); 
    values.put(Images.Media.DISPLAY_NAME, title); 
    values.put(Images.Media.DESCRIPTION, description); 
    values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
    // Add the date meta data to ensure the image is added at the front of the gallery 
    values.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); 
    values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis()); 

    Uri url = null; 
    String stringUrl = null; /* value to be returned */ 

    try { 
     url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     if (source != null) { 
      OutputStream imageOut = cr.openOutputStream(url); 
      try { 
       source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut); 
      } finally { 
       imageOut.close(); 
      } 

      long id = ContentUris.parseId(url); 
      // Wait until MINI_KIND thumbnail is generated. 
      Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null); 
      // This is for backward compatibility. 
      storeThumbnail(cr, miniThumb, id, 50F, 50F,Images.Thumbnails.MICRO_KIND); 
     } else { 
      cr.delete(url, null, null); 
      url = null; 
     } 
    } catch (Exception e) { 
     if (url != null) { 
      cr.delete(url, null, null); 
      url = null; 
     } 
    } 

    if (url != null) { 
     stringUrl = url.toString(); 
    } 

    return stringUrl; 
} 

/** 
* A copy of the Android internals StoreThumbnail method, it used with the insertImage to 
* populate the android.provider.MediaStore.Images.Media#insertImage with all the correct 
* meta data. The StoreThumbnail method is private so it must be duplicated here. 
* @see android.provider.MediaStore.Images.Media (StoreThumbnail private method) 
*/ 
private static final Bitmap storeThumbnail(
     ContentResolver cr, 
     Bitmap source, 
     long id, 
     float width, 
     float height, 
     int kind) { 

    // create the matrix to scale it 
    Matrix matrix = new Matrix(); 

    float scaleX = width/source.getWidth(); 
    float scaleY = height/source.getHeight(); 

    matrix.setScale(scaleX, scaleY); 

    Bitmap thumb = Bitmap.createBitmap(source, 0, 0, 
     source.getWidth(), 
     source.getHeight(), matrix, 
     true 
    ); 

    ContentValues values = new ContentValues(4); 
    values.put(Images.Thumbnails.KIND,kind); 
    values.put(Images.Thumbnails.IMAGE_ID,(int)id); 
    values.put(Images.Thumbnails.HEIGHT,thumb.getHeight()); 
    values.put(Images.Thumbnails.WIDTH,thumb.getWidth()); 

    Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values); 

    try { 
     OutputStream thumbOut = cr.openOutputStream(url); 
     thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut); 
     thumbOut.close(); 
     return thumb; 
    } catch (FileNotFoundException ex) { 
     return null; 
    } catch (IOException ex) { 
     return null; 
    } 
} 
} 
+0

ギャラリーアプリケーションが画像を表示する順序は、ギャラリーの開発者(およびセカンダリユーザー)までです。このコードはより多くのメタデータを提供し、ギャラリーアプリケーションの表示方法に影響を与える可能性があります。ただし、「ギャラリーの前に画像が追加されないようにする」ことはできません。 – CommonsWare

+0

ギャラリーの開発者に依存していると言われているように、ほとんど反映されない場合があります。しかし、それは確かに日付に基づいて画像を並べ替えるギャラリーで動作します。 –

関連する問題