2012-01-09 2 views
0

이미지 자르기 기능을 실행하고 잘 실행 중입니다. From here 지금 자르기 시간에 취소 이벤트를 처리해야합니다. 두 개의 버튼이 먼저 savecancel 자르기 페이지에 있습니다. 나는 클릭 리스너에서 발견했지만 실패했다. 내가 사용자 지정 코드를 실행할 수 있도록 내가 그것을 처리 할 수있는 방법은 Intent intent = new Intent("com.android.camera.action.CROP"); 기능을 사용하므로 listener를 찾지 못했습니다. 여기 자르기의 취소 이벤트 감지

내 코드입니다 : ( MainActivity)

당신의 onActivityResult를 기능에
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

:

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

마지막으로 내가'로했을 경우 (!의 resultCode = RESULT_OK) '하지만이 해결책은 나에게 좋은 희망의 모자 다 +1 –

+0

resultCode를주의 깊게 살펴 봐라. 왜냐하면 사용자가 취소 할 수도 있기 때문이다 d "PICK_FROM_CAMERA"또는 "PICK_FROM_FILE"조치도 취하십시오. – danh32

+0

예이 문제를 제기 그래서 내가 뭘합니까? –