2012-01-09 32 views
0

我開發了圖像裁剪功能並且運行良好。 From here 現在我需要在裁剪時處理取消事件。首先有兩個按鈕是savecancel在裁剪頁面。我試圖找到它的點擊監聽器,但失敗。 我找不到listner因爲它使用Intent intent = new Intent("com.android.camera.action.CROP");功能,所以我如何處理它,所以我可以解僱我的自定義代碼。檢測作物的取消事件

這裏是我的代碼:MainActivity

package net.londatiga.android; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.ActivityNotFoundException; 
import android.content.ComponentName; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.ResolveInfo; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    private Uri mImageCaptureUri; 
    private ImageView mImageView; 

    private static final int PICK_FROM_CAMERA = 1; 
    private static final int CROP_FROM_CAMERA = 2; 
    private static final int PICK_FROM_FILE = 3; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     final String [] items   = new String [] {"Take from camera", "Select from gallery"};     
     ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.select_dialog_item,items); 
     AlertDialog.Builder builder  = new AlertDialog.Builder(this); 

     builder.setTitle("Select Image"); 
     builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { //pick from camera 
       if (item == 0) { 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

        mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), 
             "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg")); 

        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 

        try { 
         intent.putExtra("return-data", true); 

         startActivityForResult(intent, PICK_FROM_CAMERA); 
        } catch (ActivityNotFoundException e) { 
         e.printStackTrace(); 
        } 
       } else { //pick from file 
        Intent intent = new Intent(); 

        intent.setType("image/*"); 
        intent.setAction(Intent.ACTION_GET_CONTENT); 

        startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 
       } 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 

     Button button = (Button) findViewById(R.id.btn_crop); 
     mImageView  = (ImageView) findViewById(R.id.iv_photo); 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.show(); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != RESULT_OK) return; 

     switch (requestCode) { 
      case PICK_FROM_CAMERA: 
       doCrop(); 

       break; 

      case PICK_FROM_FILE: 
       mImageCaptureUri = data.getData(); 

       doCrop(); 

       break;   

      case CROP_FROM_CAMERA:   
       Bundle extras = data.getExtras(); 
       Toast.makeText(MainActivity.this, "new ppappap", Toast.LENGTH_LONG).show(); 
       if (extras != null) {    
        Bitmap photo = extras.getParcelable("data"); 
        System.out.println("photo is ::: "+photo); 
        mImageView.setImageBitmap(photo); 

        try 
        { 
        ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
        photo.compress(Bitmap.CompressFormat.PNG, 100, stream); 
        byte[] byteArray = stream.toByteArray(); 
        File f = new File(Environment.getExternalStorageDirectory() 
          + File.separator + "audiometer/test.jpg"); 
        f.createNewFile(); 
        //write the bytes in file 
        FileOutputStream fo = new FileOutputStream(f); 
        fo.write(byteArray); 
        }catch (Exception e) { 
         // TODO: handle exception 
        } 
       } 

       File f = new File(mImageCaptureUri.getPath());    

       if (f.exists()) f.delete(); 

       break; 

      default: 
       Toast.makeText(MainActivity.this, "default", Toast.LENGTH_LONG).show(); 
       break; 

     } 
    } 

    private void doCrop() { 
     final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>(); 

     Intent intent = new Intent("com.android.camera.action.CROP"); 
     intent.setType("image/*"); 

     List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0); 

     int size = list.size(); 

     if (size == 0) {    
      Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show(); 

      return; 
     } else { 
      intent.setData(mImageCaptureUri); 

      intent.putExtra("outputX", 200); 
      intent.putExtra("outputY", 200); 
      intent.putExtra("aspectX", 1); 
      intent.putExtra("aspectY", 1); 
      intent.putExtra("scale", true); 
      intent.putExtra("return-data", true); 

      if (size == 1) { 
       Intent i  = new Intent(intent); 
       ResolveInfo res = list.get(0); 
       //Toast.makeText(this, "new", Toast.LENGTH_SHORT).show(); 
       i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 

       startActivityForResult(i, CROP_FROM_CAMERA); 
      } else { 
       for (ResolveInfo res : list) { 
        final CropOption co = new CropOption(); 

        co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo); 
        co.icon  = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo); 
        co.appIntent= new Intent(intent); 

        co.appIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 

        cropOptions.add(co); 
       } 

       CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions); 

       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("Choose Crop App"); 
       builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int item) { 
         Toast.makeText(MainActivity.this, "new ppappap", Toast.LENGTH_LONG).show(); 
         startActivityForResult(cropOptions.get(item).appIntent, CROP_FROM_CAMERA); 
        } 
       }); 

       builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
        @Override 
        public void onCancel(DialogInterface dialog) { 

         if (mImageCaptureUri != null) { 
          getContentResolver().delete(mImageCaptureUri, null, null); 
          mImageCaptureUri = null; 
          Toast.makeText(MainActivity.this, "inner code", Toast.LENGTH_SHORT).show(); 
         } 
         Toast.makeText(MainActivity.this, "outer code", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

       AlertDialog alert = builder.create(); 

       alert.show(); 
      } 
     } 
    } 
} 

回答

5

在您的onActivityResult功能:

if (requestCode == CROP_FROM_CAMERA && resultcode == RESULT_CANCELED { 
    // crop was cancelled 
} 
+0

最後我有'做,如果(!發送resultCode = RESULT_OK) '但是這個解決方案對我來說是一個很好的希望+1 – 2012-01-10 05:49:12

+0

只需檢查resultCode就可以了,因爲它可能是用戶取消d「PICK_FROM_CAMERA」或「PICK_FROM_FILE」動作。 – danh32 2012-01-10 14:24:54

+0

你這是提出問題,所以我做什麼? – 2012-01-11 06:08:43