2016-12-16 14 views
2

私はいくつかの提案についてギャラリーから画像を選択できるようにするための機能を実装しようとしています。変更を適用する前に、この写真を新しい写真として保存する必要があります(フィルタ、トリミングなど)。Androidの画像をギャラリーから新しいファイルにコピー

は、これまでのところ、私はやった:新しいファイル(FunctionUtil.getOutputMediaFile)、ギャラリー(FunctionUtil.refreshMediaGallery)とビットマップを保存するためのコードを更新するためのコードを取得するには

private void pickImageFromGallery(){ 
    /*Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, GALLERY_SELECT_PICTURE);*/ 

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    getIntent.setType("image/*"); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    pickIntent.setType("image/*"); 

    Intent chooserIntent = Intent.createChooser(getIntent, ""); 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

    startActivityForResult(chooserIntent, GALLERY_SELECT_PICTURE); 
} 


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

    if(resultCode == RESULT_OK){ 
     if(requestCode == GALLERY_SELECT_PICTURE){ 
      if(data == null){ 
       //TODO SHOW ERROR 
       return; 
      } 
      try { 
       Bitmap temporaryBitmap = MediaStore.Images.Media.getBitmap(myContext.getContentResolver(), data.getData()); 

       //Tried using inputStream and got the same result 
       //InputStream inputStream = myContext.getContentResolver().openInputStream(data.getData()); 
       //Bitmap temporaryBitmap = BitmapFactory.decodeStream(inputStream, null, options); 

       //Just return a file to save the bitmap into (I use the same code in different activities and it works perfectly) 
       capturedImage = FunctionUtil.getOutputMediaFile(ConstUtil.ids.MEDIA_TYPE_IMAGE); 

       FileOutputStream outputStream = new FileOutputStream(capturedImage);; 
       temporaryBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 

       //Just refresh the gallery so my new picture becomes available (I use the same function in different activities and it works fine) 
       FunctionUtil.refreshMediaGallery(capturedImage); 

      //HERE I CHECK THE PATH/GALLERY AND NOTICE THE FILE ISN'T SAVED 

      } catch (Exception e) { 
       e.printStackTrace(); 
       //TODO SHOW ERROR 
      } 

     }else if(requestCode == GALLERY_SELECT_VIDEO){ 

     } 
    } 
} 

コード(Bitmap.compress)は、同じアクティビティのさまざまな部分でうまく動作しますが、ギャラリーの画像ではうまく動作しません。

カメラAPIを使用して新しい写真を撮ってからビットマップにデコードすると完全に機能しますが、ギャラリーから画像を選択してビットマップにデコードすると機能しません。

答えて

2

このコードを使用し

if(requestCode == GALLERY_SELECT_PICTURE){ 
     InputStream inputStream = getContentResolver() 
      .openInputStream(data.getData()); 
     FileOutputStream fileOutputStream = new FileOutputStream(
            outputFile); 
     copyStream(inputStream, fileOutputStream); 
     fileOutputStream.close(); 
     inputStream.close(); 
} 

public static void copyStream(InputStream input, OutputStream output) 
      throws IOException { 

     byte[] buffer = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = input.read(buffer)) != -1) { 
      output.write(buffer, 0, bytesRead); 
     } 
    } 
関連する問題