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

你的答案检索原始图像的名称,而不是在库中保存的裁剪图像。 –

相关问题