본문 바로가기

Android68

More than one file was found with OS independent path 'META-INF/DEPENDENCIES' 안드로이드 프로젝트를 빌드 하는 중 상기 오류가 뜨며 앱이 빌드되지 않는 현상이 발생했습니다. 상기 오류가 발생하는 이유는 안드로이드가 참고하고 있는 외부 라이브러리 중에 META-INF/DEPENDENCIES를 중복으로 참고하고 있는 파일이 있기 때문입니다. 해당 오류를 해결하는 정확한 방법은 라이브러리 종속성 오류가 생기지 않게 중복으로 참고 하는 라이브러리를 개별적으로 찾아서 해당 부분만 제외시켜주는 방법입니다. 하지만. 중요한 부분이 아니라면 무시하는 방법도 있지 않을까요? 특히 META-INF과 관련된 내용은 라이브러리의 .jar 패키징과 관련된 파일일 뿐이므로 해당 오류는 무시해도 될겁니다. app 단의 build.gradle에 아래 부분을 추가해 주면, 크게 중요하지 않은 라이브러리 종속성 .. 2020. 4. 20.
The parents field is not directly writable in update requests. Use the addParents and removeParents parameters instead. Google Drive API의 files().update(fileid, metadata,con) 메소드를 사용할 때 발생했습니다. File metadata = new File().setName(name); metadata.setParents(Collections.singletonList("appDataFolder")); metadata.setMimeType("text/plain"); // Convert content to an AbstractInputStreamContent instance. ByteArrayContent contentStream = ByteArrayContent.fromString("text/plain", content); // Update the metadata and content.. 2020. 4. 15.
Google Drive API 사용시 untitled 파일만 생성될 때 최근 Google Drive API 를 사용하여 앱의 데이터 백업 기능을 추가하고 있습니다. Google Drive를 앱에 적용하는 예제는 참 많은데, 2019년 말부터 기존의 Drive API는 Deprecate 되었기 때문에, 참 많은 예제들이 다 무쓸모가 되어 버려서 약간 헤메게 되었습니다. 현재는 Oauth 2.0을 이용한 API 인증 기능등이 추가되면서 Drive REST API를 사용하게 되고, Drive API v3 을 사용하게 됩니다. 개발자 문서를 참고하여 API 콘솔을 이용하여 OAouth2.0 인증관련 기능을 추가 하는 등의 작업을 Google 로그인 기능을 추가한 뒤, Drive API 관련 기능을 추가하는데 문제가 자꾸 생기는것이었습니다. 1. 파일 업로드가 안됨. 2. 업로드가 .. 2020. 4. 14.
Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules guava-20.0.jar (com.google.guava:guava:20.0) 앱을 빌드할때 Duplicate class ---- found in modules ---- 로 나타나는 메시지가 보여지며 빌드가 되지 않는 경우가 있습니다. Duplicate class 오류는 사용한 외부라이브러리에서 참고하는 하위 라이브러리들 중 버전이 다른 라이브러리가 존재 할때 발생합니다. 커맨드 라인에 gradlew app:dependencies 를 입력한 뒤 일일이 찾아내는 방법이 있는데, 자세한 내용은 나중에 다루도록 하겠습니다. 어쨌건, Guava 라이브러리는 구글의 코어라이브러리로, 여기저기서 많이 참고하는 라이브러리인데, 해당 오류가 뜨며 빌드가 되지 않아 이걸 도대체 어떻게 찾아야 되는지 헤멨습니다. Stack Overflow 등 여러 해외포럼에서도 살펴보니 제법 많은 개발자들이 오류로.. 2020. 4. 12.
비트맵 이미지를 원형으로 크롭하기 StackOverFlow에서 발견한 좋은 코드를 일부 수정하였습니다. Width, Heigt 를 넣으면 사이즈 조절을 하도록 추가하였습니다. 원본 사이즈 그대로 원모양으로 크롭된 이미지를 출력하기 위해서는 Width와 Height에 0, 0을 넣어주면 됩니다. public static Bitmap getBitmapCircleCrop(Bitmap bitmap, int Width, int Height) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; fina.. 2020. 4. 11.
람다식(Lamda Expressions)으로 onClickListener 만들기 버튼을 눌렀을때 어떤 작업을 실행할 수 있도록 만드는 방법은 여러가지 방법이 있습니다. 2가지 방법만 예를 들어 본다면 아래와 같습니다. 1. 아래와 같이 매 개체 마다onClickListener를 연결 Button mButton1, mButton2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton1 = findViewById(R.id.button1); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { something1(); } }); mB.. 2020. 4. 11.
Google SignIn Fails with code 10 앱 개발 중 구글계정 로그인 기능을 추가하는 작업을 하던 중 해당 오류가 뜨며 로그인이 되지 않는 경우를 확인했습니다. OAuth 2.0 을 이용하여 구글 로그인 기능을 추가하는 방법은 나중에 포스팅 하게 될텐데요. 우선 해당 Exception이 생기는 이유를 먼저 말씀드리면 구글 API 콘솔의 OAuth 2.0 클라이언트 ID를 추가하는 부분에 인증정보가 존재 하지 않기 때문입니다. 그렇다면, 저는 인증정보 등록조차 하지 않고 구글 로그인 기능을 추가했느냐 하면 그것은 아닙니다. 저는 해당 기능 추가 전에 API 콘솔에 SHA-1 인증키를 포함하여 인증정보를 추가했습니다. 원인은 앱에 관련된 SHA-1 인증서는 기본적으로 두개(Debug/Release)가 존재하기 때문입니다. 우리가 앱을 빌드하면 SH.. 2020. 4. 9.
Error running 'app': Default Activity not found Default Activity 가 지정되지 않아 해당 Exception이 생길 때도 있지만 코드에 문제가 없는데도 해당 오류가 뜰때가 있습니다. Clean Build나 Rebuild를 해도 문제가 해결되지 않아 찾아보니 Android Studio의 캐시 문제로 확인되었습니다. Android Studio의 메뉴에서 File>Invalidate Caches / Restart 를 눌러주면 안드로이드 스튜디오가 캐시를 삭제하며 재시작 된 후 해당 문제가 발생하지 않음을 확인했습니다. 2020. 4. 8.
toString과 String.valueOf 의 차이점 개발을 하다보면 String형은 굉장히 자주 사용하게 됩니다. Log를 달아서 오류가 발생하는 부분을 찾을 때 사용하기도 하구요. 보통 String을 사용할때는 아래의 toString으로 사용하곤 합니다. Int someNumber = 13; String someString = someNumber.toString(); 하지만 해당 코드의 경우에는 toString의 대상이 되는 값이 null 값이 되는경우 여지 없이 nullPointException을 띄우며 앱이 종료되는 현상을 확인할 수 있습니다. 그렇다면 어떻게 해야 할까요? 아래와 같이 try/catch 로 Exception 대응을 일일이 해주어야 한다면 굉장한 낭비가 아닐 수 없습니다. try { Int someNumber = null; Strin.. 2020. 4. 4.
java.lang.ClassCastException ClassCastException은 형변환(캐스팅)을 잘못했을때 발생하는 Exception입니다. 다른 Exception과는 다르게 해당 Exception이 발생할 경우의 LogCat을 보면 어떤 코드의 몇번째 라인에서 발생하였는지를 알려주지는 않지만 아래의 예와 같이 어떤 형변환이 잘못되었는지를 알려주게 됩니다. java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams 해당 예는 LayoutParams를 잘못 적용했을때 발생한 Exception 입니다. 보통은 아래와 같이 잘못된 캐스팅을 하였을 경우에 발생합니다. Object ob.. 2020. 4. 4.