2012-09-23 20 views
16

特定のタップイベントで、ユーザーに画像を追加するように依頼します。だから私は2つのオプションを提供します:ビットマップからUriオブジェクトを取得する方法

  1. ギャラリーから追加します。
  2. カメラから新しい画像をクリックするには

私の目的は、それらの画像に関連する「uri」のリストを保持することです。

ユーザーがギャラリーを選択すると、画像uri(これはかなり簡単です)が表示されます。 しかし、彼がカメラを選んだ場合、写真を撮った後、私はその写真のビットマップオブジェクトを取得しています。

このビットマップオブジェクトをuriに変換するにはどうすればいいですか。言い換えれば、そのビットマップオブジェクトの相対Uriオブジェクトを取得するにはどうすればよいですか?

ありがとうございました。

+0

これはhttp:// stackoverflowを助けるかもしれません。com/questions/7636697/get-path-and-filename-from-camera-intent-result –

+0

コードの一部はかなりハードコードされています。 イメージのファイル名をハードコードしたくありません。 必ずしも画像がDCIMフォルダに保存されているとは限りません。 –

答えて

0

post I mentioned in my comment..から次のコードスニペットを試してみましたが、うまくいきました。 logcatで

/** 
* Gets the last image id from the media store 
* 
* @return 
*/ 
private int getLastImageId() { 
    final String[] imageColumns = { MediaStore.Images.Media._ID, 
      MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; 
    Cursor imageCursor = managedQuery(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, 
      null, null, imageOrderBy); 
    if (imageCursor.moveToFirst()) { 
     int id = imageCursor.getInt(imageCursor 
       .getColumnIndex(MediaStore.Images.Media._ID)); 
     String fullPath = imageCursor.getString(imageCursor 
       .getColumnIndex(MediaStore.Images.Media.DATA)); 
     Log.d(getClass().getSimpleName(), "getLastImageId::id " + id); 
     Log.d(getClass().getSimpleName(), "getLastImageId::path " 
       + fullPath); 
     imageCursor.close(); 
     return id; 
    } else { 
     return 0; 
    } 
} 

出力:

09-24 16:36:24.500: getLastImageId::id 70 
09-24 16:36:24.500: getLastImageId::path /mnt/sdcard/DCIM/Camera/2012-09-24 16.36.20.jpg 

また、私は上記のコード内の任意のharcoded名は表示されません。 これが役立つことを願っています。

0
Try To Use this May Be Helpful to you : 

new AsyncTask<Void, Integer, Void>() { 
      protected void onPreExecute() { 
      }; 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       imageAdapter.images.clear(); 
       initializeVideoAndImage(); 
       return null; 
      } 

      protected void onProgressUpdate(Integer... integers) { 
       imageAdapter.notifyDataSetChanged(); 
      } 

      public void initializeVideoAndImage() { 
       final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Thumbnails._ID }; 
       String orderBy = MediaStore.Images.Media._ID; 
       Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); 

       final String[] videocolumns = { MediaStore.Video.Thumbnails._ID, MediaStore.Video.Media.DATA }; 
       orderBy = MediaStore.Video.Media._ID; 
       Cursor videoCursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocolumns, null, null, orderBy); 
       int i = 0; 
       int image_column_index = 0; 

       if (imageCursor != null) { 
        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); 
        int count = imageCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         imageCursor.moveToPosition(i); 
         int id = imageCursor.getInt(image_column_index); 
         ImageItem imageItem = new ImageItem(); 
         imageItem.id = id; 
         imageAdapter.images.add(imageItem); 

        } 
       } 

       if (videoCursor != null) { 
        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); 
        int count = videoCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         videoCursor.moveToPosition(i); 
         int id = videoCursor.getInt(image_column_index); 
         ImageItem imageItem = new ImageItem(); 
         imageItem.id = id; 
         imageAdapter.images.add(imageItem); 
        } 
       } 
       publishProgress(i); 
       if (imageCursor != null) { 
        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); 
        int count = imageCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         imageCursor.moveToPosition(i); 
         int id = imageCursor.getInt(image_column_index); 
         int dataColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA); 
         ImageItem imageItem = imageAdapter.images.get(i); 
         Bitmap img = MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
         int column_index = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
         imageItem.imagePath = imageCursor.getString(column_index); 
         imageItem.videoPath = ""; 
         try { 
          File imageFile = new File(Environment.getExternalStorageDirectory(), "image" + i); 
          imageFile.createNewFile(); 
          ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

          if (bos != null && img != null) { 
           img.compress(Bitmap.CompressFormat.PNG, 100, bos); 
          } 
          byte[] bitmapData = bos.toByteArray(); 
          FileOutputStream fos = new FileOutputStream(imageFile); 
          fos.write(bitmapData); 
          fos.close(); 
          imageItem.thumbNailPath = imageFile.getAbsolutePath(); 
          try { 
           boolean cancelled = isCancelled(); 
           // if async task is not cancelled, update the 
           // progress 
           if (!cancelled) { 
            publishProgress(i); 
            SystemClock.sleep(100); 

           } 

          } catch (Exception e) { 
           Log.e("Error", e.toString()); 
          } 
          // publishProgress(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         // imageAdapter.images.add(imageItem); 
        } 
       } 
       imageCursor.close(); 

       if (videoCursor != null) { 
        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); 
        int count = videoCursor.getCount() + i; 
        for (int j = 0; i < count; i++, j++) { 
         videoCursor.moveToPosition(j); 
         int id = videoCursor.getInt(image_column_index); 
         int column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
         ImageItem imageItem = imageAdapter.images.get(i); 
         imageItem.imagePath = videoCursor.getString(column_index); 
         imageItem.videoPath = imageItem.imagePath; 
         System.out.println("External : " + imageItem.videoPath); 
         try { 
          File imageFile = new File(Environment.getExternalStorageDirectory(), "imageV" + i); 
          imageFile.createNewFile(); 
          ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
          MediaMetadataRetriever mediaVideo = new MediaMetadataRetriever(); 
          mediaVideo.setDataSource(imageItem.videoPath); 
          Bitmap videoFiles = mediaVideo.getFrameAtTime(); 
          videoFiles = ThumbnailUtils.extractThumbnail(videoFiles, 96, 96); 
          if (bos != null && videoFiles != null) { 
           videoFiles.compress(Bitmap.CompressFormat.JPEG, 100, bos); 

          } 
          byte[] bitmapData = bos.toByteArray(); 
          FileOutputStream fos = new FileOutputStream(imageFile); 
          fos.write(bitmapData); 
          fos.close(); 
          imageItem.imagePath = imageFile.getAbsolutePath(); 
          imageItem.thumbNailPath = imageFile.getAbsolutePath(); 
          try { 
           boolean cancelled = isCancelled(); 
           // if async task is not cancelled, update the 
           // progress 
           if (!cancelled) { 
            publishProgress(i); 
            SystemClock.sleep(100); 

           } 

          } catch (Exception e) { 
           Log.e("Error", e.toString()); 
          } 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

        } 
       } 
       videoCursor.close(); 
      } 

      protected void onPostExecute(Void result) { 
       imageAdapter.notifyDataSetChanged(); 
      }; 

     }.execute(); 

    } 
31

私は私のプロジェクトで同じ問題を抱えているので、私は、ビットマップからURIを取得するための簡単な方法(click here)に従います。

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 
+4

'Images.Media.insertImage'は' MediaStore.Images.Media.insertImage'になりました。この許可を追加するために覚えておく必要があるもう一つのことは次のとおりです: ' ' –

+8

これはアンドロイド6.0のヌルパスを返します。 –

+0

2つのマシュマロデバイス、Motorolaはパスを返しますが、Samsungは' nullを返します。どんな助け? – sud007

5
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 

上記の行は、あなたのAndroidデバイスにいくつかの余分なスペースを消費するビットマップを使用してサムネイルを作成します。

この方法は、余分なメモリを消費せずにビットマップからUriを取得するのに役立ちます。

public Uri bitmapToUriConverter(Bitmap mBitmap) { 
    Uri uri = null; 
    try { 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, 100, 100); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, 200, 200, 
      true); 
    File file = new File(getActivity().getFilesDir(), "Image" 
      + new Random().nextInt() + ".jpeg"); 
    FileOutputStream out = getActivity().openFileOutput(file.getName(), 
      Context.MODE_WORLD_READABLE); 
    newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    out.flush(); 
    out.close(); 
    //get absolute path 
    String realPath = file.getAbsolutePath(); 
    File f = new File(realPath); 
    uri = Uri.fromFile(f); 

    } catch (Exception e) { 
    Log.e("Your Error Message", e.getMessage()); 
    } 
return uri; 
} 
+0

calculateInSampleSizeとは何ですか?方法を追加してください。 –

+0

@Anand:このhttp://stackoverflow.com/questions/2641726/decoding-bitmaps-in-android-with-the-right-sizeは、適切な解決策を見つけた場合に役立ちます。 – Hanan

+0

inSampleSizeは無視できます。 samplesizeを2に設定すると、画像の2番目のピクセルだけを取り込むように、画質が2ずつ低下します。このオプションを1にするか設定しないかは問題ありません。 – lxknvlk

0

これは私のために働いたものです。例えば、ビデオからサムネイルをビットマップ形式で取得する。次に、ビットマップオブジェクトをURIオブジェクトに変換できます。

String videoPath = mVideoUri.getEncodedPath(); 
System.out.println(videoPath); //prints to console the path of the saved video 
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND); 

Uri thumbUri = getImageUri(this, thumb); 
0

カメラから画像を取得した場合、ビットマップからUriを取得する方法がないため、まずビットマップを保存してください。パーミッションを追加することを忘れいけないと:

打ち上げカメラ意図は

startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), 8) 
その後、

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 

    if (resultCode == Activity.RESULT_OK && requestCode == 8) { 
     val bitmap = data?.extras?.get("data") as Bitmap 

     val uri = readWriteImage(bitmap) 
    } 
} 

fun readWriteImage(bitmap: Bitmap): Uri { 
    // store in DCIM/Camera directory 
    val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
    val cameraDir = File(dir, "Camera/") 

    val file = if (cameraDir.exists()) { 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } else { 
     cameraDir.mkdir() 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } 

    val fos = FileOutputStream(file) 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos) 
    fos.flush() 
    fos.close() 

    Uri.fromFile(file) 
} 

PSウリをビットマップを格納し、返すメソッドを作成してオーバーライドします実行時アクセス許可を処理する(API> = 23)

関連する問題