2013-12-13 2 views
3

http://www.londatiga.net/featured-articles/how-to-select-and-crop-image-on-android/에서 자르기 이미지 튜토리얼을 학습했지만 결과 또는 자르기 후에 이미지가 SD 카드에 저장되지 않는 경우 어떻게 수정합니까?이미지를 저장하고 경로를 저장하는 방법 sd 카드에서 Android를 잘라 냈습니까?

이 테 코드

package net.londatiga.android; 

import java.io.File; 

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.provider.MediaStore; 
import android.view.View; 

import android.net.Uri; 

import android.os.Bundle; 
import android.os.Environment; 

import android.widget.Button; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 
import android.widget.ImageView; 

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(); 

       if (extras != null) {    
        Bitmap photo = extras.getParcelable("data"); 

        mImageView.setImageBitmap(photo); 
       } 

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

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

       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); 

       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) { 
         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; 
         } 
        } 
       }); 

       AlertDialog alert = builder.create(); 

       alert.show(); 
      } 
     } 
    } 
} 

미안 내 영어

답변

5

당신이 당신의 onActivityResult를 자른 이미지 비트 맵을 얻는다. Sd 카드에 저장하려면 CROP_FROM_CAMERA 경우에 저장하십시오. 그렇지 않으면 직접 비트 맵을 사용할 수 있습니다.

case CROP_FROM_CAMERA:   
      Bundle extras = data.getExtras(); 

      if (extras != null) {    
       Bitmap photo = extras.getParcelable("data"); 

       mImageView.setImageBitmap(photo); 
       String root = Environment.getExternalStorageDirectory().toString(); 
       File myDir = new File(root + "/saved_images");  
       myDir.mkdirs(); 
       Random generator = new Random(); 
       int n = 10000; 
       n = generator.nextInt(n); 
       String fname = "Image-"+ n +".jpg"; 
       File file = new File (myDir, fname); 
       if (file.exists()) file.delete(); 
       try { 
        FileOutputStream out = new FileOutputStream(file); 
        photo.compress(Bitmap.CompressFormat.JPEG, 90, out); 
        out.flush(); 
        out.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

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

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

      break; 

위의 코드 사진 변수에는 사용자의 비트 맵이 있습니다. 당신은 그것을 사용할 수 있습니다. SD 카드의 saved_images 폴더에 이미지가 저장됩니다.

+0

감사합니다. ** 사례 ** ** ** **까지 코드를 완성 할 수 있습니까? – bukanamay

+0

나는 그것을 편집했다. – rachit

+0

고마워요, 그것의 작품 .... 매니페스트에 추가해야합니다 'use-permission android : name = "android.permission.WRITE_EXTERNAL_STORAGE"/> bukanamay

관련 문제