지식메모

반응형





그냥 간단하게 사진 자르기 해서 이미지 넣으려고 했는데


킷캣에서 부터 팅기는 현상이 발생했다.



팅기는 영상.



정말 뜬금없다. 킷캣 전부터는 쭉 잘 되던거였는데... 


웃긴 건 이상하게 특정사진만 자르면 팅긴다. 원본사진은 100kb밖에 안되는 사진인데도 말이다.


도대체 원인 뭔지 한참을 찾아헤맸다.


어찌어찌 해결을 됐는데 완벽한 해결책은 아니다..


킷캣문제인가 해서 찾아보기도 하고..


참고한 링크들이다.


http://blog.tstore.co.kr/107


https://plus.google.com/112692779577336772166/posts/9MbmSsUcd1e


http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=81704


안드로이드 사이드 위 글을 보고 해결을 했다.


사진 크롭 코드를 보면 이런 부분이 있다.

기존 코드는 이렇게 되어있었는데


intent.putExtra("outputX", 120);

intent.putExtra("outputY", 130);


안드로이드사이드 글에서 이게 문제라는 댓글을 보았다.



그래서 저 숫자를 

intent.putExtra("outputX", 100);

intent.putExtra("outputY", 100);


100로 작게 바꿔주었다.


그랬더니?? 신기하게 팅기지가 않는다. 최소한 내 폰에서는...



그래서 임시방편으로나마 해결을 했는데 찜찜하다.

다른 폰에서는 자르기는 되는데 자른 이미지가 깨진건지 안나온다;;;



찾아보면서 얻은 결론은


 메모리 부족으로 발생하는 것이다.

 바인더 Intent에 1MB 이상의 데이터를 넘기게되면 발생할 수 있다.

보통 제공되는 크롭을 사용하게 되면 발생하므로 이미지 크롭의 경우 직접 구현해서 사용하는게 낫다는 의견

하지만 직접 구현할 능력이..;; 그리고 찾아본 예제들은 거의 다 기본 제공 크롭소스이다..



마지막으로 위 영상의 예제 코드를 올린다.

아마도 다 이 코드를 쓸 것이다. 퍼질대로 퍼진 대중적인 코드(xml은 제외)



package com.example.camera

import java.io.File;
import com.example.camera.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnClickListener {
	private ImageView mPhotoImageView;// 이미지 받기
	private ImageView foot;
	private Uri mImageCaptureUri;

	private static final int PICK_FROM_CAMERA = 0;
	private static final int PICK_FROM_ALBUM = 1;
	private static final int CROP_FROM_CAMERA = 2;
	LinearLayout bar, mother = null;
	FrameLayout container = null;
	Bitmap bm = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button mButton = (Button) findViewById(R.id.load);
		mPhotoImageView = (ImageView) findViewById(R.id.profile);
		mButton.setOnClickListener(this);
	}

	private void doTakePhotoAction() {
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

		// 임시로 사용할 파일의 경로를 생성
		String url = "tmp.jpg";

		mImageCaptureUri = Uri.fromFile(new File(Environment
				.getExternalStorageDirectory(), url));

		intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
				mImageCaptureUri);

		// 특정기기에서 사진을 저장못하는 문제가 있어 다음을 주석처리 합니다.
		// intent.putExtra("return-data", true);
		startActivityForResult(intent, PICK_FROM_CAMERA);

	}

	private void doTakeAlbumAction() {
		// 앨범 호출
		Intent intent = new Intent(Intent.ACTION_PICK);
		intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
		startActivityForResult(intent, PICK_FROM_ALBUM);
	}

	@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", 120);
			intent.putExtra("outputY", 130);
			// intent.putExtra("aspectX", 1);
			// intent.putExtra("aspectY", 1);
			intent.putExtra("scale", true);
			intent.putExtra("return-data", true);

			startActivityForResult(intent, CROP_FROM_CAMERA);

			break;
		}
		}
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.load) {
			DialogInterface.OnClickListener cameraListener = new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					doTakePhotoAction();
				}
			};

			DialogInterface.OnClickListener albumListener = new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					doTakeAlbumAction();
				}
			};

			DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					dialog.dismiss();
				}
			};

			new AlertDialog.Builder(this).setTitle("업로드할 이미지 선택")
					.setPositiveButton("사진촬영", cameraListener)
					.setNeutralButton("앨범선택", albumListener)
					.setNegativeButton("취소", cancelListener).show();

		}

	}
}




팅길 때 찍힌 로그.



12-14 20:59:51.831: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!!

12-14 20:59:51.831: I/ActivityManager(1242): Restarting because process died: ActivityRecord{42d64570 u0 com.example.camera/.MainActivity t1511}

12-14 20:59:51.831: D/AlwaysOnTopManagerService(1242): setRearTouchLongPress(): flag = false, mIsLongPress = false

12-14 20:59:51.851: W/WindowManager(1242): view not successfully added to wm, removing view

12-14 20:59:51.861: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!!

12-14 20:59:51.861: W/ActivityManager(1242): Exception when starting activity com.example.camera/.MainActivity

12-14 20:59:51.861: W/ActivityManager(1242): android.os.TransactionTooLargeException

12-14 20:59:51.861: W/ActivityManager(1242): at android.os.BinderProxy.transact(Native Method)

12-14 20:59:51.861: W/ActivityManager(1242): at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:761)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1072)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1168)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.resumeTopActivityLockedInner(ActivityStack.java:2327)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1482)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2196)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1077)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:964)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:5364)

12-14 20:59:51.861: W/ActivityManager(1242): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:427)

12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2159)

12-14 20:59:51.861: W/ActivityManager(1242): at android.os.Binder.execTransact(Binder.java:404)

12-14 20:59:51.861: W/ActivityManager(1242): at dalvik.system.NativeStart.run(Native Method)

12-14 20:59:51.872: D/WindowManager(1242): win:Window{435b3a88 u0 com.example.camera/com.example.camera.MainActivity}mOemFlagWin:null,mSaveOemFlags:0,mCurrentFocus:Window{449c9898 u0 com.android.gallery3d/com.android.gallery3d.filtershow.crop.CropActivity}

12-14 20:59:51.882: I/ActivityManager(1242): Start proc com.example.camera for activity com.example.camera/.MainActivity: pid=6109 uid=10007 gids={50007}

12-14 20:59:51.882: D/ActivityManager(1242): checkHideDockBarApplication.result = NOK

12-14 20:59:51.892: D/dalvikvm(6109): Late-enabling CheckJNI

12-14 20:59:51.922: D/dalvikvm(6109): Debugger has detached; object registry had 1 entries

12-14 20:59:51.922: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!! 


위 로그를 보고 어느 분이 달아주신 댓글..


TransactionTooLargeException 발생한거네요..
바인더 Intent에 1MB 이상의 데이터를 넘기게되면 발생할 수 있습니다.
보통 제공되는 크롭을 사용하게 되면 발생하구요.. 이미지 크롭의 경우 직접 구현해서 사용하는게 낫습니다.


나중에 좀 더 완벽한 해결책을 적용할 수 있으면 좋겠다.




반응형
반응형

마이크로소프트 링크


http://support2.microsoft.com/kb/2551928/ko

반응형
반응형




가격 입력할 때 천단위 마다 콤마를 넣을 수 있는 방법



String money="999999999"
long value = Long.parseLong(money);
DecimalFormat format = new DecimalFormat("###,###");//콤마
format.format(value);
String result_int = format.format(value);



이 코드를 추가해주면 천 단위마다 콤마가 자동으로 찍힌다.


안드로이드에서 에디트 텍스트에서 숫자를 입력 받아


텍스트 뷰에 result_int 값을 출력시켜 사용하였다.

반응형
반응형




진짜 뭐 좀 테스트 해볼려고 프로젝트 새로 생성했는데 하자마자 문제가 뙇!!!!!!!


제일 싫어하는 상황이다. 뭐 해보기도 전에 문제 생기는거..


검색을 해보니 다양한 해결 방법이 있었는데 먼저 가장 많이 보였던 방법으로


R.java 파일이 있다면...


코드의 위쪽에 보면


 import android.R;


이 선언되어 있다. 이 코드를 지운다.


   직접 만든 리소스를 참조할 때는 import 패키지명.R; 요렇게 선언해야 한다.


예를 들면

R.java 있으면 패키지명 수정 com.example.ex.R



BUT


나는 파일 자체가 없었다. 왜 없어진건지 모르겠다. clean 하면서 없어지는 경우가 있다고 한다. 

clean을 했던거 같기도 하고 ..


문제는 R.java 파일이 없어서 생기는 문제인거 같았다


▲ gen 폴더에 아무 것도 없다!!




에러가 뜬다..


▲ R 에 빨간 줄이 표시됐다..




검색을 해보니 프로젝트 > Properties > Java Build Path 에 가서

Order and Export 탭에서 Android 버전을 최상위로 올리면 된다고 한다.


▲ Android 4.2.2 를 선택 후 오른쪽 top을 눌러 맨 위로 위치시킨다.




▲ Android 4.2.2 를 최상위로 올리는 모습



 

올리기 전

  

 

올린 후

▲ Android 4.2.2 가 맨 위로 올라간 모습


Project - Clean(단축키 Alt+P+N)'으로 재컴파일하면 'R.java' 파일이 재생성된다.


이렇게만 해주면 된다고 한다. 근데 나는??

변화가 없다.



그래서 이클립스 상단 메뉴 Project > Build Project 를 해주었다.

(만약 비활성화 되어있다면 Build Automatically를 해제해준다)



안 생겼다면  Build Automatically 체크해본다.


뭐 어쨌든 프로젝트 clean 이후 다시 빌드하기를 왔다갔다 하다보니



그랬더니 생겼다!!


▲ gen 폴더에 R.java가 생겼다




에러도 없어졌다

▲ 깔끔



그래도 안된다면.. 프로젝트에서 gen 을 살펴보자




저 꼴도 보기 싫은 appcompat 이 사라지진 않았는지 보자.

어디서 구할 수 있다면 appcompat 프로젝트 안에서 저걸 복사해서 붙여넣기 하는 것도 방법인 것 같다.


appcompat_v7.zip


일단 첨부.

아니면 sdk 폴더에서

/extras/android/support/v7/appcompat/ 

위 경로의 프로젝트를 import 한다.



마찬가지로 프로젝트의 R.java 파일도 다른 프로젝트에서 복사 붙여넣기 시도해본다.



진짜 이거 아오 빡친다.

이거 롤리팝인지 킷캣부터 이상한거 생기더니 골치만 아파졌다.


문제의 원인은 정말 다양해서 이 방법으로 해결 안 될 수도 있다.

검색해보면 다양한 방법이 나오는데 이 방법으로 해결을 했으나

다른 컴에서 또 발생했을 때는 해결이 안됐다.


전에 백업해놓은 프로젝트가 있어서 그걸 다시 불러왔다.


검색하면 서로 이렇게 하면 된다 하는데 왜 꼭 내가 하면 다 안될까?


오늘도 별 것도 아닌데 시간낭비...




반응형
반응형




안드로이드 xml 파일을 보기 위해서 graphical Layout 을 자주 보곤 하는데 갑자기 안뜬다.


Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V in Android



뭐 이런 내용이 뜨는데 왜 그런가 해서 삽질하다가 검색하니까 알았다.


상단에 안드로이드 아이콘을 보면 처음에 API 20으로 되어있었다.


얼마 전에 이클립스 새로 깔면서 업데이트 했었었다.


그래서 원래 API 19로 바꿔주었더니 graphical layout 이 다시 떴다.




아무튼 최신버전이 새로 나오면 골칫거리가 많다.


지금도 또 뭔가 안되는데 미치겠다









반응형
반응형








이건 또 뭐임...


아 진짜 업데이트할 때가 제일 짱난다. 뭐 건드리면 또 생기고..



아무튼 빨리 또 검색..


그나마 이건 빨리 해결됐다


Project > Build Automatically 를 해제해 주면 된다고 한다.

이거 건드린 적도 없었는데..



움짤 ㄱㄱ




이제야 모든 에러가 잡혔다. 아니 그냥 안보이게 감춰둔 것일 수도..

잠복기를 거치다 나중에 또 크게 터지는거 아닌가 두렵다.



여기까지 오게 된 사연은

이클립스에서 google-play-services_lib 이거 때문에 SDK 를 업데이트 했는데

계속 


This Android SDK requires Android Developer Toolkit Version 23.0.0 or above


이 버전 문제 때문에 import를 할 수가 없어서골머리 앓다가


컴터 쓴지 오래되서 걍 포맷해버리고 이클립스 새로 깔면서 이렇게 됐다


분명 나는 23.0.2로 23.0.0보다 높은 버전인데도 말이다.



Cannot complete the install because of a conflicting dependency


이 메시지로 검색해보면 많은 방법이 나오는데 내가 잘 못하는 건지 해결이 안됐다..

답 없으면 싹 밀었다 다시 하는 방법 밖에는..


그래서 삭제하고 재설치도 해봤지만 부질없는 짓이었다.




여러 방법을 써봤는데 해결이 안됐다.

결국 새로설치로 해결을 했지만..


혹시 아시는 분이 계시다면 해결책을 알고 싶다.





반응형
반응형







exprot aborted because fatal lint error


project has compliation error


 is not translated in ko 


짱나




뭔가 엄청나보이는 문제가...


String.xml은 지금까지 멀쩡했었다. 그런데 갑자기 실행하려니까 이런 에러가 뜨면서 안된다.


또 급 빡...


다시 검색해보니..


이클립스 메뉴에서 Window > Preferrence > Android >Lint Error Checking 

 옵션으로 가서 체크해제해줘야 된다고 한다.




그러면 된다고 해서 해봤는데 여전하다..


그래서 답답해서 Restore Defaults 하고 Apply 했다.


그런데 없어졌다..

느낌표



위에 Run error full check 를 하고 해결된 사람들도 있으니 이거 먼저 해보고 

안되면 Restore Defaults 해보는 것을 추천드립니다.



이제 다 끝났나 보다 하고 이제 서명된 APK 생성을 시작했는데 또 문제 발생...


부글부글



conversion to Dalvik format failed with error 1


뭔데 이건 또...

이것도 다음 글에..





반응형
반응형




구글 정책이 뭔가 바꼈다고 해서 라이브러리를 추가할 일이 생겼는데 시작부터 골치가 아프다.


진짜 뭔가 수정사항 생기면 두려움이 먼저 앞선다..


수정사항은 앱 프로젝트에 google-play-services_lib 를 추가해줘야 된다는 것이었다.



그래서 매뉴얼 대로 추가해주었다.







그러나 문제 또 발생..


메니페스트 파일에 문장을 추가해줬는데 여기서 에러가 나는 것이었다..



에러메시지는

error: Error: No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version').




다시 들어가 보니 라이브러리가 제대로 안되어있었다.







인터넷에 물어보고 메일도 담당자 메일도 보내봤는데 원인은 라이브러리 경로 때문이라고 한다.

google-play-services_lib 프로젝트를 workspace로 import한 다음에 add 하면 된다고 한다.



그랬다. 현재 앱 프로젝트는 E: 드라이브에 있었고 google-play-services_lib는 C: 드라이브에 있었다.


google-play-services_lib 경로.

C:\eclipse\adt-bundle-windows-x86_64-20140702\sdk\extras\google\google_play_services\libproject\google-play-services_lib


그래서 E:에 있는 앱 프로젝트를 그냥 컨트롤 C 해서 workspace 에 붙여넣고 다시 import 했더니..





뚜쉬...







아나 또 생전 첨보는 에러가 떴다.


그래서 다시 또 질문하고 검색했더니 

workspace에 앱프로젝트와 google-play-services_lib 프로젝트가 같이 있어야 한다는? 결론을 얻었다.



그 방법으로 찾아 낸 것이 Copy projects into workspace 였다.


프로젝트를 import 할 때 이 옵션을 체크해주라는 것이다.




앱 프로젝트 import 할 때







google-play-services_lib 프로젝트 import 할 때






그러면 workspace 폴더에 가보면 두 프로젝트가 나란히 있는 것을 볼 수 있다.


에러도 없어졌고 하니 이제 잘 되나 Run을 해보았는데..


또 문제 발생..


exprot aborted because fatal lint error


project has compliation error


??


String.xml 에 엄청난 에러가 뜬다.

in not translated in ko...


이 문제는 다음 글에..


http://yonoo88.tistory.com/524






반응형

+ Recent posts