2015-06-10 3 views
0

Я не хочу использовать какой-либо код изменения растрового изображения, если я могу ему помочь. У меня есть метод, чтобы получить URI миниатюрного MINI, когда я получаю фотографии из галереи, но когда я пытаюсь сделать то же самое с камерой не работает:Android получить миниатюру Uri после получения изображения с камеры

Вот методы:

private Uri getParsedUri(Uri selectedImageUri) { 
    Uri parsed = null; 
    try { 
     String uri = getThumbnailPath(selectedImageUri); 

     if (uri != null) { 
      Timber.d("Thumb uri found %s", uri); 
      File file = new File(uri); 
      parsed = Uri.fromFile(file); 
      Timber.d("thumb uri parsed : %s", parsed); 
     } else { 
      Timber.d("Thumb uri not found, using : %s", selectedImageUri); 
     } 
    } catch (Exception e){ 
     Timber.e(e, "Error getting mini uri"); 
    } 
    return parsed; 
} 

private String getThumbnailPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media._ID }; 
    String result = null; 
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
    if (cursor != null && cursor.getCount() > 0) { 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media._ID); 

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

     Cursor cursor2 = MediaStore.Images.Thumbnails.queryMiniThumbnail(
       getContentResolver(), imageId, 
       MediaStore.Images.Thumbnails.MINI_KIND, 
       null); 
     if (cursor2 != null && cursor2.getCount() > 0) { 
      cursor2.moveToFirst(); 
      result = cursor2.getString(cursor2.getColumnIndexOrThrow(MediaStore.Images.Thumbnails 
        .DATA)); 
      cursor2.close(); 
     } 
    } 
    return result; //always null for pictures from the Camera 
} 

Вот как я обеспечиваю Ури экстренно для приложения камера:

private void onTakePhotoFromCameraClick() { 
    final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
//  takePicUri = Uri.fromFile(getTempFile(ProductNewActivity.this)); 
    takePicUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new ContentValues()); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, 
      takePicUri); 
    startActivityForResult(intent, OPTION_TAKE_PHOTO_FROM_CAMERA); 
} 


private File getTempFile(Context context) { 
    final File path = new File(Environment.getExternalStorageDirectory(), 
      context.getPackageName()); 
    if (!path.exists()) { 
     path.mkdir(); 
    } 
    long millis = new Date().getTime(); 
    String name_file = String.valueOf(millis); 
    File tempImageFile = new File(path, "MyImage_" + name_file + ".tmp"); 
    return tempImageFile; 
} 

обоих методов получения Uri (либо с помощью распознавателя контента или создания моего обычая Uri, не работают, и я никогда не сможет получить thumbnail. Есть ли способ указать систему на создать эскиз? Всегда ли создается эскиз ?.

Редактировать: Думаю, я не объяснил четко. Мне нужно 2 Uri: один для большого изображения и один для миниатюры. Мне не нужны растровые изображения. Я использую Universal Image Loader для отображения изображений, поэтому мне не нужен небольшой растровый рисунок. Я сам создаю Uri для большого изображения, но я хотел бы найти способ для Android генерировать эскиз, поскольку он уже делает это для фотографий галереи.

+0

Почему голосовать вниз? Не могли бы вы объяснить, почему вы проголосовали, поэтому я могу исправить то, что не так? – vallllll

ответ

0

У меня есть эта часть кода, которая может вам помочь, позвольте мне сказать вам, что этот код вызовет камеру и сделает снимок, сохраненный во внешнем каталоге с полным разрешением, и вы можете ссылаться на этот путь в любое время.

final int TAKE_PHOTO_REQ = 100; 
    String file_path = Environment.getExternalStorageDirectory() 
      + "/recent.jpg"; 
    file = new File(file_path); 
public void takePic(){ 
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(intent, TAKE_PHOTO_REQUEST_FRAG); 
} 
@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
     case TAKE_PHOTO_REQ: { 
      if (resultCode == TakePicture.RESULT_OK && data != null) { 

       Bitmap myBmp = (Bitmap) data.getExtras().get("data"); 



       imageView.setImageBitmap(myBmp); 
       ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

       // you can create a new file name "recent.jpg" in sdcard folder. 
       File f = new File(file_path); 
       try { 
        f.createNewFile(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       // write the bytes in file 
       FileOutputStream fo = null; 
       try { 
        fo = new FileOutputStream(f); 
       } catch (FileNotFoundException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       try { 
        fo.write(bytes.toByteArray()); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       // remember close de FileOutput 
       try { 
        fo.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.e("take-img", "Image Saved to sd card..."); 

       break; 
      } 
     } 
     } 
    } 

Надеюсь, это вам поможет.

+0

Я не хочу растрового изображения, я хочу Uri для небольших изображений. – vallllll

+0

Попробуйте получить uri с самого пути. @ Vallllll – sahulab

+0

Да, но он создает дополнительный файл и дополнительный растровый рисунок, который мне не нужен. Мне было интересно, есть ли способ получить миниатюру, которую создает Android по умолчанию. – vallllll

0

Если вы заинтересованы только в миниатюру затем начать намерение следующим образом:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, TAKE_THUMB); 

Тогда в OnActivityResult вы можете извлечь палец с намерением, как:

Bundle extras = data.getExtras(); 
Bitmap bitmap = (Bitmap) extras.get("data"); 
imageView1.setImageBitmap(bitmap); 
+0

Спасибо, но на Samsung Galaxu S5 я получаю нулевой дополнительный – vallllll

Смежные вопросы