@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode != RESULT_OK)
{
return;
}
switch(requestCode)
{
case CROP_FROM_CAMERA:
{
// 크롭이 된 이후의 이미지를 넘겨 받습니다. 이미지뷰에 이미지를 보여준다거나 부가적인 작업 이후에
// 임시 파일을 삭제합니다.
final Bundle extras = data.getExtras();
if(extras != null)
{
Bitmap photo = extras.getParcelable("data");
mPhotoImageView.setImageBitmap(photo);
}
// 임시 파일 삭제
File f = new File(mImageCaptureUri.getPath());
if(f.exists())
{
f.delete();
}
break;
}
case PICK_FROM_ALBUM:
{
// 이후의 처리가 카메라와 같으므로 일단 break없이 진행합니다.
// 실제 코드에서는 좀더 합리적인 방법을 선택하시기 바랍니다.
mImageCaptureUri = data.getData();
}
case PICK_FROM_CAMERA:
{
// 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다.
// 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다.
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(mImageCaptureUri, "image/*");
intent.putExtra("outputX", 90);
intent.putExtra("outputY", 90);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, CROP_FROM_CAMERA);
break;
}
}
}위 소스는 설명에 써 있는 것과 같이 이미지를 크롭하고 크롭한 이미지를 이미지 뷰에 뿌려주는 것으로 이해하고 있습니다.
제가 하고 싶은 것은 크롭한 이미지를 sdcard에 저장하는 것입니다.
저장할 때 이름을 직접 지정하지 않고 자동으로 만들어져서 저장되는 방법을 알고 싶습니다.
인터넷에 있는 소스들을 해봤는데 실력이 부족해서 계속 오류가 나기에 이렇게 글을 올립니다.
그리고 임시파일 삭제(16~25줄)가 어떤 것을 의미하는지 궁금합니다.
추가로 카메라 같은 경우는 에뮬에서 동작이 되지 않는 것 같습니다.
그래서 핸드폰에 연결하여 실행하고 확인하는데 핸드폰도 컴퓨터와 연결이 되있으면 사진이 안찍힙니다.
때문에 로그캣을 볼 수 없는데 다른 분들은 어떠한 방법으로 하시는지 궁금합니다. 감사합니다.
사진은 저장이 되었는데 업데이트가 안되어서 그렇습니다.
private final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_STARTED))
Toast.makeText(PhotoEditMain.this, "사진을 업데이트하고있습니다" ,
Toast.LENGTH_SHORT).show();
else if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED))
Toast.makeText(PhotoEditMain.this, "사진이 업데이트 되었습니다" ,
Toast.LENGTH_SHORT).show();
}
};
이렇게 브로드캐스트 리시버 메서드를 넣으시구요
MediaStore.Images.Media.insertImage(getContentResolver(), photo, "title", "descripton"); 뒤에다가
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
registerReceiver(mReceiver, intentFilter);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
이렇게 미디어 스캐닝 코드를 붙이면 미디어가 스캐닝되면서 업데이트 잘될겁니다.
카메라의 경우에는
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
메니페스트에서 이렇게 퍼미션을 주시고 DDMS로 들어가서 Window > showview > file explorer를 클릭하시면
에뮬레이터 폴더가뜹니다. 거기서 sdcard폴더를 클릭하시고 file explorer 오른쪽 상단에보면 디스크같이 생긴얘하고
휴대폰처럼 생긴얘들이 잇을겁니다. 그중에 휴대폰처럼생긴애(push file onto a device)를 선택하시면 이미지를
에뮬레이터 갤러리에 넣을수 있습니다




저도 초보이기때문에 정확하지않다는걸 미리 말씀드릴께요. 코드전체를 보지못해서 어떤식으로 사진을 받아오는지 모르겠지만 사진을 먼저받아와서 크롭된 파일을만든뒤에 그파일을 이미지뷰에 뿌려주고 이미지뷰에 그림은 뿌려졌으니 크롭된 파일을삭제하는거같네요.
이름을 직접지정하지않고 자동으로 만들어진다는것이 어떤건지 잘모르겠습니다.
MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "title", "descripton");
저는 이런식으로 이미지를 갤러리에 넣었는데 "title"은 제목, "description"은 사진 설명쯤되는거같은데 그냥 저렇게만 넣어도
사용자가 직접 제목을 설정하거나 하지는 않더라구요. 혹시 id같이 유니크한 title을 쓰실꺼면 사진을 저장하는 날짜와
시간을 title로 이용하시는건 어떨지요? 같이 공부하는 입장에서 조금이나마 도움이 됐으면 좋겠습니다