2015-05-12 68 views
0

好讓開放的,我試過這段代碼:如何從位圖(棒棒堂)

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

,看上去就像它不能做的工作。當我登錄它,它打印:

content://media/external/images/media/25756 

,因爲我需要它new File(Uri)不幫助我。奇怪的是,getImageUri方法返回Uri,但文件似乎無法識別它。任何人都有從新鮮製作的位圖檢索Uri的方法?

P.S.就我看來,自從KitKat以後,它就無法工作。

編輯 此代碼的工作,並從這個我要檢索的URI:

   croppedBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
       cropImageView = (CropImageView) findViewById(R.id.CropImageView); 
       cropImageView.setImageBitmap(croppedBitmap); 


     Button crop = ...; 
     crop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cropContainer.setVisibility(View.GONE); 
       mImageView.setVisibility(View.VISIBLE); 
       Bitmap croppedImage = cropImageView.getCroppedImage(); 
       mImageView.setImageBitmap(croppedImage); 
       paramsContener.setVisibility(View.VISIBLE); 
      } 
     }); 

回答

1

,看上去就像它不能做的工作

這將取決於什麼「工作」是。

當我登錄它,它打印:content://media/external/images/media/25756不幫助我,因爲我需要它的新文件(URI)

首先,如果你想保存一個位圖文件,使用一個FileOutputStream而不是ByteArrayOutputStream。 Java文件I/O已經存在了大約20年。其次,如果您希望從ContentProvider(如MediaStore)獲得文件路徑,您將會感到失望。你回到Uri,就像你的問題中的content://一樣。 A Uri is not a file。使用ContentResolveropenInputStream()等方法讀入由Uri標識的數據。 「URI」的概念代表了對你通過流獲得的東西的不透明句柄,至少與擁有約25年曆史的HTTP一樣長。

奇怪的是,getImageUri方法返回Uri,但文件似乎無法識別它。

這是因爲Uri不是文件。

+0

我基於android文檔,其中構造函數以Uri和String作爲參數。我更新了我的問題,以解釋我想從哪個位圖獲取Uri。 –

+0

@ jeand'arme:「這段代碼正常工作,從此我想檢索Uri」 - 你已經有了'Uri'。它是你的'getBitmap()'調用的第二個參數。如果你的意思是你想從'CropImageView'中獲得某種裁剪後的輸出,並且它返回一個'Bitmap',並且你希望'File'指向'Bitmap',那麼使用'compress()'將它寫入'FileOutputStream'來將'Bitmap'寫入'File'。 – CommonsWare

+0

哦,我忘了添加缺失的拼圖,它是'Bitmap croppedImage = cropImageView.getCroppedImage();'並且我想從中獲得它。這就是爲什麼那個來自第二個爭論的Uri不會做這份工作。 –

0

好吧,我得到了@CommonsWare的感謝 - 做了這樣的事情。希望將幫助另一個人以及:

public String makeBitmapPath(Bitmap bmp){ 
     // TimeStamp 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 

     String path = Environment.getExternalStorageDirectory().toString(); 
     OutputStream fOut = null; 
     File file = new File(path, "Photo"+ timeStamp +".jpg"); // the File to save to 
     try { 
      fOut = new FileOutputStream(file); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
      fOut.flush(); 
      fOut.close(); // do not forget to close the stream 

      MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); 
     } catch (IOException e){ 
      // whatever 
     } 
     return file.getPath(); 
    }