2013-01-20 39 views
0

我試圖使用一種方法來裁剪圖像。確切地說,這種方法:意圖setDataAndType作爲位圖

private void performCrop() { 
    try { 
     //call the standard crop action intent (the user device may not support it) 
     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     //indicate image type and Uri 
     cropIntent.setDataAndType(**HERE**, "image/*"); 
     //set crop properties 
     cropIntent.putExtra("crop", "true"); 
     //indicate aspect of desired crop 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     //indicate output X and Y 
     cropIntent.putExtra("outputX", 256); 
     cropIntent.putExtra("outputY", 256); 
     //retrieve data on return 
     cropIntent.putExtra("return-data", true); 
     //start the activity - we handle returning in onActivityResult 
     startActivityForResult(cropIntent, 1234); 
    } 
    catch(ActivityNotFoundException anfe){ 
     Log.d("debugging","EXCEPTION");/* 
     //display an error message 
     String errorMessage = "Whoops - your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show();*/ 
    } 
} 

這一行,要求Uri數據和字符串類型。

cropIntent.setDataAndType(**HERE**, "image/*"); 

但我只想把這個位圖

Bitmap fotoCreada; 

的數據,但我不知道該怎麼做。

有什麼辦法可以達到這個目的嗎?

謝謝。

編輯

好吧,這是我的代碼現在:

有一個按鈕。當你點擊它時:

public void onClick(View v) { 
      Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
      if(isSDPresent) { 
       //Creem carpeta 
       File folder = new File(Environment.getExternalStorageDirectory().toString()+"/pic/"); 
       folder.mkdirs(); 
       //Recuperem data actual 
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
       String currentDateandTime = sdf.format(new Date()); 
       //Cridem a la camara. 
       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       resultingFile=new File(folder.toString() + "/"+currentDateandTime+".jpg"); 
       Uri uriSavedImage=Uri.fromFile(resultingFile); 
       cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
       //Començem activity 
       startActivityForResult(cameraIntent, 1888); 
      } else { 
       Toast toast = Toast.makeText(getActivity(), "Issues while accessing sdcard.", Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
     } 

正如你所看到的,它調用startActivityForResult。基本上拍照,我找回它activityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d("debugging",""+resultCode); 
    if(requestCode == 1888 && resultCode == -1) { //-1 = TOT HA ANAT BE. 
     Bitmap photo = BitmapFactory.decodeFile(resultingFile.getPath()); 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     Bitmap photoRotated = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true); 
     this.fotoCreada=photoRotated; 
     ((ImageView) myFragmentView.findViewById(R.id.fotoCapturada)).setImageBitmap(this.fotoCreada); 
     try { 
      FileOutputStream out = new FileOutputStream(this.resultingFile.getPath()); 
      this.fotoCreada.compress(Bitmap.CompressFormat.PNG, 90, out); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     performCrop(); 
    } 
    if (requestCode == 1234 && resultCode == -1){ 
     Bitmap bitmap = (Bitmap) data.getParcelableExtra("BitmapImage"); 
     Log.d("debugging",""+bitmap.getHeight()); 
    } 
} 

正如你可以從上面的代碼看,因爲我檢索位圖,我把方法performCrop。它的代碼,現在是:

private void performCrop() { 
    try { 
     //call the standard crop action intent (the user device may not support it) 
     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     //indicate image type and Uri 
     //cropIntent.setDataAndType(this.picUri, "image/*"); 
     cropIntent.putExtra("BitmapImage", this.fotoCreada); 
     //set crop properties 
     cropIntent.putExtra("crop", "true"); 
     //indicate aspect of desired crop 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     //indicate output X and Y 
     cropIntent.putExtra("outputX", 256); 
     cropIntent.putExtra("outputY", 256); 
     //retrieve data on return 
     cropIntent.putExtra("return-data", true); 
     //start the activity - we handle returning in onActivityResult 
     startActivityForResult(cropIntent, 1234); 
     Log.d("debugging","he acabat performCrop"); 
    } 
    catch(ActivityNotFoundException anfe){ 
     Log.d("debugging","EXCEPTION"); 
     //display an error message 
     String errorMessage = "Whoops - your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 

但startActivityForResult從performCrop永不結束調用onActivityResult。 Log貓說它只輸入一次,並且應該輸入兩次。第一個來自相機活動,第二個來自作物活動。

-1 
he acabat performCrop 

希望它很清楚。

謝謝。

回答

2

Bitmap實現Parcelable,所以你總是可以通過它的意圖:

Intent intent = new Intent(this, NewActivity.class); 
intent.putExtra("BitmapImage", bitmap); 

,並在另一端檢索:如果位圖作爲文件形式存在或

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 

然而,一個資源,它總是更好地傳遞位圖的URI或ResourceID而不是位圖本身。傳遞整個位圖需要大量的內存。傳遞URL需要很少的內存,並允許每個活動根據需要加載和縮放位圖。

+0

好的。聽起來不錯。但我的代碼不起作用。我將在幾秒鐘內編輯我的主要帖子。檢查一下,並給我一個關於如何解決它的提示,請。 – Reinherd

+0

好的,現在更新了。一探究竟。 – Reinherd

0

使用Intent.putExtra。位圖是parceable,所以它會工作。 setDataAndType用於URI,但不是引用Web上或磁盤上的資源。

+0

這就是我正在試圖用我的編輯代碼實現的。 cropIntent.putExtra(「BitmapImage」,this.fotoCreada); – Reinherd