2015-09-14 77 views
0

我有一個圖像修剪選項的應用程序。裁剪實際圖像後,裁剪後的圖像保存在圖庫中。我的問題是如何檢索保存在圖庫中的裁剪圖像的文件名和路徑。如何獲取修剪後保存的圖像的文件名和路徑

我的代碼,

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

我已經嘗試了很多,但沒有檢索文件名和路徑。有沒有解決辦法。

+0

看到這個鏈接它可以幫助你[鏈接](http://www.e-nature.ch/tech/saving-loading-bitmaps-to-the-android-device-storage-internal-external/) – Irfan

+0

''mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), 「tmp_avatar_」+ String.valueOf(System.currentTimeMillis())+「.jpg」));'是在哪裏存儲捕獲的圖像或什麼? – Bhargav

+0

@Bhargav: - 是的,圖像從相機捕獲。但如何獲得從圖庫中選擇的圖像的路徑和文件名。 –

回答

2

你正在使用startActivityForResult(),但你重寫onActivityResult()?在您的情況下,您需要執行以下操作:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == PICK_FROM_FILE && resultCode == RESULT_OK) 
    { 
     Uri pictureUri = data.getData(); 
    } 
} 

此代碼獲取圖片的Uri。然後你可以使用這個URI來獲取路徑,使用類似下面的方法:

private String getRealPathFromURI(Context context, Uri contentUri) 
{ 
    Cursor cursor = null; 
    try 
    { 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     cursor = context.getContentResolver().query(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } finally 
    { 
     if (cursor != null) 
     { 
      cursor.close(); 
     } 
    } 
} 

編輯

後您裁剪位圖,並準備去,你可以像這樣保存:

private Uri saveOutput(Bitmap croppedImage)  
{ 
    Uri saveUri = null; 
    // Saves the image in cache, you may want to modify this to save it to Gallery 
    File file = new File(getCacheDir(), "cropped"); 
    OutputStream outputStream = null; 
    try 
    { 
     file.getParentFile().mkdirs(); 
     saveUri = Uri.fromFile(file); 
     outputStream = getContentResolver().openOutputStream(saveUri); 
     if (outputStream != null) 
     { 
      croppedImage.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); 
     } 
    } catch (IOException e) 
    { 
     // log the error 
    } 

    return saveUri; 
} 

越來越開放的後,就可以得到路徑裁剪圖像與上述相同的方法。

+0

再次查看代碼。我已經完成了這個方法。 –

+0

不敢相信我沒有向下滾動!對不起,現在閱讀其餘的... – NecipAllef

+0

你的答案檢索原始圖像的名稱,而不是在庫中保存的裁剪圖像。 –

相關問題