티스토리 뷰


초콜릿처럼 달달해진 안드로이드 4.4

안드로이드 4.4 릴리즈전 확인 사항

+  Posted : 2013-12-02

안녕하세요! 개발자센터 입니다.

4.4 타겟으로 릴리즈 하시기전에 꼭 읽어보시기 바랍니다!


SMS 이슈


보통 서비스에서 SMS를 보내는 기능을 사용할 경우에는 Intent.ACTION_SEND를 통해서 보내는 것이 일반적이다. 또한 코드상에서 미리 전화번호를 명시하는 것이 아니라 사용자가 직접 SMS을 보내는 화면에서 상대방의 전화번호를 입력하는게 보통이다.




그래서 개발자는 Uri.parse(“smsto:전화번호")를 사용하기보다는 Uri.parse(“sms:”)를 통하여 사용자가 직접 보낼사람을 선택하도록한다. 그러나 4.4에서는 이런방식으로 문자를 보내게되면(지금 내가 사용하는 디폴트 SMS앱은 행아웃이다.) SMS앱에서 계속 전화번호를 검색하여 무한로딩 상황에 빠지게 된다

이에 이러한 상황을 해결하기 위해 아래와 같이 버전별 분기처리를 하면 정상적으로 사용할 수 있게된다.

 

// 19(4.4)이상부터는 새로운 코드 적용
if (Build.VERSION.SDK_INT > 18) {
	String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(getApplicationContext());
	Intent sendIntent = new Intent(Intent.ACTION_SEND);
	sendIntent.setType(“text/plain”);
	sendIntent.putExtra(Intent.EXTRA_TEXT, “보낼 메시지”);
	if (defaultSmsPackageName != null) {
		sendIntent.setPackage(defaultSmsPackageName);
	}
	startActivity(sendIntent);
} else {
 // 18이하는 기존코드
	Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(“sms:”));
	intent.putExtra(“sms_body”, “보낼 메시지”);
	startActivity(intent);
}



위 코드를 적용하면 4.4의 경우 먼저 보낼 사용자를 선택하고 그 이후에 설정한 메시지가 정의되어있는 메시지 화면으로 진입하며 바로 문자를 보낼 수 있게된다. 이 현상은 해당앱의 타켓버전이 19보다 낮아도 발생하는 현상이므로 꼭 체크하여야한다.





이미지 가져오기 이슈

보통 이미지를 가져오기 위해서 Intent.ACTION_GET_CONTENT를 이용해 intent chooser에서 이미지 리스트를 볼 수 있는 앱 항목 중 갤러리를 통해 이미지를 가지고 온다. 





그러나 4.4에서 이를 그대로 사용할 경우 4.4에서 추가된 ‘Storage access framework’에서 제공하는 UI가 나타나고 여기에서 사용할 이미지를 클릭해도 해당 이미지를 가지고 올 수 없게된다.


기존에 사용하던 ACTION_GET_CONTENT가 Storage access framework에 통합되었기 때문이다.





물론 코드수정을 통해 새로운 UI를 이용 이미지를 가지고 오게하도록 하는것이 맞지만 부득이하게 시간이 없거나 이전과 같은 사용자 경험을 제공하고 싶다면 아래와 같이 ACTION_GET_CONTENT에서 ACTION_PICK으로 코드를 수정한다


intent.setAction(Intent.ACTION_GET_CONTENT); // 에서

intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); //으로 수정한다.


이 현상은 해당앱의 타켓버전이 19보다 낮아도 발생하는 현상이므로 꼭 체크하여야한다.


이미지 크롭이 되지 않는 이슈





위 그림처럼 크롭 후 이미지뷰에 활성화 되지 않는 이슈가 있어 분석해 보았더니 아래와 같은 문제가 복합적으로 적용되어 있었다.


파일패스 이슈


아래와 같은 메서드를 통해 파일 패스를 참조하는 경우.

결과값은 정상적인 경로인 file://storage/emulated/0/tmp.jpg 가 아니라file:///storage/emulated/0/tmp.jpg 으로 전달 됨.

 
public static Uri getTempUri(){
 return Uri.fromFile(new File(Environment.getExternalStorageDirectory() + “/tmp.jpg”)); 
}


이에 아래와 같이 이미지를 저장하기 위해 파일패스로서 해당 메서드를 사용할 경우 4.3이하 버전의 경우 상관없이 동작하지만 4.4의 경우에는 파일저장에 실패한다.

intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());


이미지 크롭 이슈


이미지를 크롭할 경우 크롭한 파일을 특정 경로에 저장하기 위해서 아래와 같이 구현할 경우 이미지가 제대로 저장되지 않는 경우가 발생한다

 
Intent intent = new Intent(“com.android.camera.action.CROP”);
intent.setDataAndType(CommonUtil.getTempUri(), “image/*”);
intent.putExtra(“aspectX”, "넓이");
intent.putExtra(“aspectY”, "높이");
intent.putExtra(MediaStore.EXTRA_OUTPUT, “저장할 파일의 경로”);
intent.putExtra(“outputFormat”, Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, REQ_PICK_FROM_CAMERA);


이에 크롭된 이미지를 번들을 통해 비트맵 파일로 전달 받는 방식으로 변경하여 사용하도록한다.


 
Intent intent = new Intent(“com.android.camera.action.CROP”);
intent.setDataAndType(CommonUtil.getTempUri(), “image/*”);
intent.putExtra(“aspectX”, "넓이");
intent.putExtra(“aspectY”, "높이");
// 번들을 통해 파일을 전달하는 방식으로 변경
intent.putExtra(“return-data”, true);
startActivityForResult(intent, REQ_PICK_FROM_CAMERA);
 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
 case REQ_PICK_FROM_CAMERA:
 if (resultCode == RESULT_OK) {
    Bundle extras = data.getExtras();
    Bitmap cropImg = extras.getParcelable(“data”);
…


사업자 정보 표시
SK플래닛 | 서진우 | 경기도 성남시 분당구 판교로 264 the Planet | 사업자 등록번호 : 104-86-36968 | TEL : 02-1600-6573 | Mail : devhelper@tstore.co.kr | 통신판매신고번호 : 제2014-경기성남-0036호 | 사이버몰의 이용약관 바로가기
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글