webentwicklung-frage-antwort-db.com.de

Holen Sie sich ein Miniaturbild Uri/Pfad des in SD-Karte + Android gespeicherten Bildes

SDK-Version - 1.6

Ich verwende folgende Absicht, um die Standardgalerie von Android zu öffnen:

Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(
                        Intent.createChooser(intent, "Select Picture"), 101);

In onActivityResult kann ich jetzt den ursprünglichen Uri und den Pfad des ausgewählten Bildes abrufen, aber ich kann den Uri und den Pfad des Miniaturbilds des ausgewählten Bildes nicht abrufen.

Code zum Abrufen des Originalbildes Uri und Pfad:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        try {

            if (requestCode == 101 && data != null) {

                Uri selectedImageUri = data.getData();
                String selectedImagePath = getPath(selectedImageUri);
} else {
                Toast toast = Toast.makeText(this, "No Image is selected.",
                        Toast.LENGTH_LONG);
                toast.show();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

PS: 1) Ich möchte das Bild nicht so skalieren Frage . Ich suche speziell nach den Miniaturbildern, die von Android OS selbst generiert werden.

2) Verwendung von SDK Version 1.6, also kein Interesse an ThumbnailUtils class.

21
mudit

Sie können dies verwenden, um die Miniaturansicht zu erhalten:

Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnails(
                             getContentResolver(), selectedImageUri,
                             MediaStore.Images.Thumbnails.MINI_KIND,
                             (BitmapFactory.Options) null );

Es gibt zwei Arten von Miniaturansichten:
MINI_KIND: Miniaturansicht 512 x 384
MICRO_KIND: 96 x 96-Miniaturansicht

ODER verwenden Sie [queryMiniThumbnails] [1] mit fast denselben Parametern, um den Pfad des Miniaturbilds abzurufen.

EDIT

Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnails(
                             getContentResolver(), selectedImageUri,
                             MediaStore.Images.Thumbnails.MINI_KIND,
                             null );
if( cursor != null && cursor.getCount() > 0 ) {
     cursor.moveToFirst();//**EDIT**
     String uri = cursor.getString( cursor.getColumnIndex( MediaStore.Images.Thumbnails.DATA ) );
}

HTH!

[1]: https://developer.Android.com/reference/Android/provider/MediaStore.Images.Thumbnails.html#queryMiniThumbnails(Android.content.ContentResolver , Android.net.Uri, int, Java. lang.String [])

79
Karan

Diese / Lösung arbeitet an mir!

final int THUMBSIZE = 128;

Bitmap thumbImage = ThumbnailUtils.extractThumbnail(
                         BitmapFactory.decodeFile(file.getAbsolutePath()), 
                         THUMBSIZE, 
                         THUMBSIZE);
8
Mete

Es könnte eine Alternative sein, wie andere bereits in ihrer Antwort erwähnt hatten, aber die einfache Möglichkeit, Miniaturbilder zu erhalten, ist ExifInterface

ExifInterface exif = new ExifInterface(pictureFile.getPath());
byte[] imageData=exif.getThumbnail();
Bitmap  thumbnail= BitmapFactory.decodeByteArray(imageData,0,imageData.length);
7
dharam

Zwei Varianten ohne veraltete Methoden.

 public String getThumbnailPath(Uri uri) {
    String[] proj = { MediaStore.Images.Media.DATA };

    // This method was deprecated in API level 11
    // Cursor cursor = managedQuery(contentUri, proj, null, null, null);

    CursorLoader cursorLoader = new CursorLoader(activity, uri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();

    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

    cursor.moveToFirst();
    long imageId = cursor.getLong(column_index);
    //cursor.close();
    String result="";
    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(activity.getContentResolver(), imageId,
            MediaStore.Images.Thumbnails.MINI_KIND, null);
    if (cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
        cursor.close();
    }
    return result;
}
public Bitmap getThumbnailBitmap(Uri uri){
    String[] proj = { MediaStore.Images.Media.DATA };

    // This method was deprecated in API level 11
    // Cursor cursor = managedQuery(contentUri, proj, null, null, null);

    CursorLoader cursorLoader = new CursorLoader(activity, uri, proj, null, null, null);
    Cursor cursor = cursorLoader.loadInBackground();

    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

    cursor.moveToFirst();
    long imageId = cursor.getLong(column_index);
    //cursor.close();

    Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
            getContentResolver(), imageId,
            MediaStore.Images.Thumbnails.MINI_KIND,
            (BitmapFactory.Options) null );

    return bitmap;
}
5
uberchilly

Basierend auf der Antwort von @ Karan und den folgenden Kommentaren, nur für die Menschen, die hier ankommen (wie ich) und einen Code für die Arbeit benötigen:

public String getThumbnailPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media._ID };
    String result = null;
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media._ID);

    cursor.moveToFirst();
    long imageId = cursor.getLong(column_index);
    cursor.close();

    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(
            getContentResolver(), imageId,
            MediaStore.Images.Thumbnails.MINI_KIND,
            null);
    if (cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
        cursor.close();
    }
    return result;
}
4
Juan Sánchez
2
Josnidhin
public static String getThumbnailPath(Context context, String path)
{
  long imageId = -1;

  String[] projection = new String[] { MediaStore.MediaColumns._ID };
  String selection = MediaStore.MediaColumns.DATA + "=?";
  String[] selectionArgs = new String[] { path };
  Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null);
  if (cursor != null && cursor.moveToFirst())
  {
    imageId = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
    cursor.close();
  }

  String result = null;
  cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(context.getContentResolver(), imageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
  if (cursor != null && cursor.getCount() > 0)
  {
    cursor.moveToFirst();
    result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
    cursor.close();
  }

  return result;
}
2
susemi99

Die akzeptierte Antwort funktioniert für mich nicht. Ich verwende folgende Methode, um es zu machen:

    try{
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), uri);
        Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(bitmap,120,120);
        // imageView.setImageBitmap(thumbBitmap);
    }
    catch (IOException ex){
        //......
    }
0
Yun CHEN