안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요. 제가 내외부 메모리에서 이미지파일을 저장해서 공유하는 기능을 구현중인데요.
제대로 구현한것인지 알고자 글을 올립니다. 공유부분인데 설정을 잘못한건지 공유가 되는 어플이 있고 안되는 어플이 있네요..ㅜㅜ
우선 외부메모리(sdcard)에서 파일 저장하고 공유한 부분입니다.
externalDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"temp");
externalDir.mkdir();
요렇게 우선 디렉토리를 생성하였습니다.
그다음에 tempBitmap라는 비트맵파일을 미리 만들어 놓고
FileOutputStream out = new FileOutputStream("/sdcard/temp/temp.jpg");
tempBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
요런식으로 temp디렉토리에 있는 temp.jpg에 저장을 하였구요.
다음으로는 공유하는 부분입니다.
Intent intent = new Intent(Intent.ACTION_SEND);
File file = new File("/sdcard/roughmap/temp.jpg");
Uri uri =Uri.fromFile(file);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_STREAM,uri );
startActivity(Intent.createChooser(intent, "Choose"));
이렇게 해서 sdcard에 이미지를 저장한 후 공유하는 것을 구현하였습니다.
다음은 내부메모리에서 파일을 저장하고 공유한 부분입니다.
따로 디렉토리 설정안하고 기본(files)디렉토리밑에 저장하였습니다.
위와 마찬가지로 tempBitmap이라는 비트맵을 만들어서 내부메모리에 temp.jpg라는 파일에 저장하는 부분입니다.
FileOutputStream internalOut = getContext().openFileOutput("temp.jpg",Context.MODE_WORLD_READABLE);
tempBitmap.compress(Bitmap.CompressFormat.JPEG, 100, internalOut);
다음으로 공유하는 부분입니다.
File file = new File("/data/data/설치된 패키지 이름/files/temp.jpg") ;
Uri uri =Uri.fromFile(file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_STREAM,uri );
startActivity(Intent.createChooser(intent, "Choose"));
이렇게 해서 내부메모리에 이미지를 저장한 후 공유하는 것을 구현하였습니다. 빨간부분이 sdcard부분과 다른 부분입니다.
여기서 두가지 질문이 있습니다.
우선은 제가 file explorer에서 파일들 접근권한이 drwx------ 이런식으로 10글자로 표시된것을 보았는데요.
이것들의 의미를 알려주실분 계신가요? -rw------- 이런것도 있었고 한데 제가 검색능력이 모잘라다보니 아직도 못찾았네요..ㅜㅜ
제가 위의 부분을 넥서스원과 디자이어에서 테스트중입니다.
그런데 넥서스원에서는 트위터 공식어플과 기본메시징프로그램에서 내외부에 저장된 이미지가 정상적으로 가는 것을 보았지만 쥐메일프로그램에서는 메일이 아예 안가고 밑에 이미지 용량도 안떴습니다. 그런데 기본 갤러리에서는 이미지를 공유하니 쥐메일에서 바로 이미지파일용량이 뜨더군요. 하지만 기본갤러리에서도 전송이 되지 않았습니다.
그리고 디자이어에서는 기본메일프로그램에서는 바로 정상적으로 갔지만 기본메시징프로그램이 공유목록에 안잡혀서 메시지는 테스트하지 못하엿습니다.
위에서처럼 데이터를 공유해서 보낼때는 전적으로 설치된 프로그램(트위터,메시징,쥐메일등)에만 의존되는 것인가요?
아니면 제가 위의 코드에서 설정을 잘못한 부분이 있는 건가요?
개발은 2.1버전에서 하고 있습니다.
제대로 구현한것인지 알고자 글을 올립니다. 공유부분인데 설정을 잘못한건지 공유가 되는 어플이 있고 안되는 어플이 있네요..ㅜㅜ
우선 외부메모리(sdcard)에서 파일 저장하고 공유한 부분입니다.
externalDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"temp");
externalDir.mkdir();
요렇게 우선 디렉토리를 생성하였습니다.
그다음에 tempBitmap라는 비트맵파일을 미리 만들어 놓고
FileOutputStream out = new FileOutputStream("/sdcard/temp/temp.jpg");
tempBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
요런식으로 temp디렉토리에 있는 temp.jpg에 저장을 하였구요.
다음으로는 공유하는 부분입니다.
Intent intent = new Intent(Intent.ACTION_SEND);
File file = new File("/sdcard/roughmap/temp.jpg");
Uri uri =Uri.fromFile(file);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_STREAM,uri );
startActivity(Intent.createChooser(intent, "Choose"));
이렇게 해서 sdcard에 이미지를 저장한 후 공유하는 것을 구현하였습니다.
다음은 내부메모리에서 파일을 저장하고 공유한 부분입니다.
따로 디렉토리 설정안하고 기본(files)디렉토리밑에 저장하였습니다.
위와 마찬가지로 tempBitmap이라는 비트맵을 만들어서 내부메모리에 temp.jpg라는 파일에 저장하는 부분입니다.
FileOutputStream internalOut = getContext().openFileOutput("temp.jpg",Context.MODE_WORLD_READABLE);
tempBitmap.compress(Bitmap.CompressFormat.JPEG, 100, internalOut);
다음으로 공유하는 부분입니다.
File file = new File("/data/data/설치된 패키지 이름/files/temp.jpg") ;
Uri uri =Uri.fromFile(file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_STREAM,uri );
startActivity(Intent.createChooser(intent, "Choose"));
이렇게 해서 내부메모리에 이미지를 저장한 후 공유하는 것을 구현하였습니다. 빨간부분이 sdcard부분과 다른 부분입니다.
여기서 두가지 질문이 있습니다.
우선은 제가 file explorer에서 파일들 접근권한이 drwx------ 이런식으로 10글자로 표시된것을 보았는데요.
이것들의 의미를 알려주실분 계신가요? -rw------- 이런것도 있었고 한데 제가 검색능력이 모잘라다보니 아직도 못찾았네요..ㅜㅜ
제가 위의 부분을 넥서스원과 디자이어에서 테스트중입니다.
그런데 넥서스원에서는 트위터 공식어플과 기본메시징프로그램에서 내외부에 저장된 이미지가 정상적으로 가는 것을 보았지만 쥐메일프로그램에서는 메일이 아예 안가고 밑에 이미지 용량도 안떴습니다. 그런데 기본 갤러리에서는 이미지를 공유하니 쥐메일에서 바로 이미지파일용량이 뜨더군요. 하지만 기본갤러리에서도 전송이 되지 않았습니다.
그리고 디자이어에서는 기본메일프로그램에서는 바로 정상적으로 갔지만 기본메시징프로그램이 공유목록에 안잡혀서 메시지는 테스트하지 못하엿습니다.
위에서처럼 데이터를 공유해서 보낼때는 전적으로 설치된 프로그램(트위터,메시징,쥐메일등)에만 의존되는 것인가요?
아니면 제가 위의 코드에서 설정을 잘못한 부분이 있는 건가요?
개발은 2.1버전에서 하고 있습니다.
2010.07.17 00:41:29
1번 : 안드로이드가 리눅스를 기반으로 하고 있고, 리눅스와 유닉스에서는 파일에 대한 접근 권한이라는 개념이 있습니다.
다음 링크 한번 읽어보세요
http://www.ibm.com/developerworks/kr/library/tutorial/au-unixtips1/section5.html
참고로 adb shell 로 뜨는 커멘드 쉘에서도 chmod 명령어가 먹습니다.
2번 : 안드로이드에서 어플간 또는 어플내 연동방식에 대한 내용입니다만,
Intent intent = new Intent(Intent.ACTION_SEND); ....; startActivity(intent);
이렇게 되면, 이게 무슨 소리냐 하면, "시스템에 등록된 모든 액티비티 중에, ACTION_SEND 기능이 있는 액티비티 나와라.. 오바!!"
하고 안드로이드 시스템에 주문을 넣는 것과 같습니다. 이 때 자동 혹은 수동으로 선택된 액티비티로 모든 제어가 넘어가버립니다.
일단 제어가 넘어가면 그 때부터는 선택되어 실행된 액티비티가 알아서 동작하는 거죠. 호출자가 더이상 손쓸 방법은 없다고 보면 될거 같습니다.
2010.07.17 00:54:02
rhoon님 답변감사합니다.
내부메모리에서 생성된 파일이 -rw------- 이라면 소유하고 있는 어플에서만 읽고쓰고할수 있다는 거군요.
그러면 안드로이드에서는 링크주신 사이트 내용중에서
첫 번째
두 번째세 번째
로 매칭되는건가요? 두번째 그룹은 안드로이드에서는 어느 부분이 되는건가요?
그리고 공유부분은 등록된 액티비티중 ACTION_SEND 가진 액티비티에서 제가 보내준 이미지파일을 잘 쓰기를 바랄뿐이겠군요.
공유테스트하다 이게 되는건지 안되는건지 헷갈려서 좌절중이였습니다. 다시한번 답변 감사합니다.
내부메모리에서 생성된 파일이 -rw------- 이라면 소유하고 있는 어플에서만 읽고쓰고할수 있다는 거군요.
그러면 안드로이드에서는 링크주신 사이트 내용중에서
첫 번째
rwx
는 사용자 권한을 설정한다. 즉, 파일 소유자가 가지는 권한을 뜻한다. -> 실행한 어플리케이션두 번째
rwx
는 그룹 권한을 설정한다. 즉, 그룹 구성원이 가지는 권한을 뜻한다. -> ?
rwx
는 기타 권한을 설정한다. 즉, 시스템 내 모든 사용자가 가지는 권한을 뜻한다. -> 설치된 다른 어플리케이션들공유테스트하다 이게 되는건지 안되는건지 헷갈려서 좌절중이였습니다. 다시한번 답변 감사합니다.