https://www.googleapis.com/language/translate/v2?key=자신의 키&source=en&target=ko&q=Hello%20world

Multipart send from retrofit2


1. ApiService


interface ApiService {

    @Multipart

    @POST("your_upload_url")

    fun uploadMultipleFiles(

            @Part file1: MultipartBody.Part?,

            @Part file2: MultipartBody.Part?,

            @Part file3: MultipartBody.Part?,

            @Part file4: MultipartBody.Part?)

            : Call<FileUploadResult>

}


2. ApiFactory (result xml parsing)

fun createXmlForImageUpload(): SLApiService {

        val interceptor = HttpLoggingInterceptor()

        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)

        val client:OkHttpClient  = OkHttpClient.Builder()

                .connectTimeout(180,TimeUnit.SECONDS) //timeout setting

                .readTimeout(180,TimeUnit.SECONDS) //timeout setting

                .writeTimeout(180,TimeUnit.SECONDS) //timeout setting

                .addInterceptor(interceptor).build() // log interceptor

        val retrofit = Retrofit.Builder()

                .baseUrl("your api base url")

                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

                .addConverterFactory(SimpleXmlConverterFactory.create()) // xml parsing factory

                .client(client)

                .build()

        return retrofit.create(ApiService::class.java)

    } 


3. used Api


private fun uploadImage() {

        val apiService = SLApiFactory.createXmlForImageUpload()

        var image1:MultipartBody.Part? = null

        var image2:MultipartBody.Part? = null

        var image3:MultipartBody.Part? = null

        var image4:MultipartBody.Part? = null


        if (SelectImageData.mGridItemList.size > 0) {

            image1 = prepareFilePart("image1",EditorUtil.makeMiniPath(SelectImageData.mGridItemList.get(0),this@SendImageActivity))

        }

        if (SelectImageData.mGridItemList.size > 1) {

            image2 = prepareFilePart("image2",EditorUtil.makeMiniPath(SelectImageData.mGridItemList.get(1),this@SendImageActivity))

        }


        if (SelectImageData.mGridItemList.size > 2) {

            image3 = prepareFilePart("image3",EditorUtil.makeMiniPath(SelectImageData.mGridItemList.get(2),this@SendImageActivity))

        }


        if (SelectImageData.mGridItemList.size > 3) {

            image4 = prepareFilePart("image4",EditorUtil.makeMiniPath(SelectImageData.mGridItemList.get(3),this@SendImageActivity))

        }


        apiService.uploadMultipleFiles(image1,image2,image3,image4).enqueue(object:Callback<FileUploadResult>{

            override fun onFailure(call: Call<FileUploadResult>?, t: Throwable?) {

                

            }


            override fun onResponse(call: Call<FileUploadResult>?, response: Response<FileUploadResult>?) {

                

            }

        })

    } 


#----Glide--- start
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

#---Glide V4.X
-dontwarn com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool
-dontwarn com.bumptech.glide.load.resource.bitmap.Downsampler
-dontwarn com.bumptech.glide.load.resource.bitmap.HardwareConfigState
#----Glide--- end


'Development > Android' 카테고리의 다른 글

Google Translate  (0) 2018.05.30
Multipart used retrofit2  (0) 2018.05.16
If Broadcast Receiver is taking too long to receive in onReceive()  (0) 2018.05.04
Multidex setting  (0) 2018.04.06
apk 파일 디컴파일 하기  (0) 2018.04.06

BroadCastReceiver 호출 시


리시버 호출이 늦게 될 경우


intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);


를 추가해서 호출 속도를 높여준다.



출처 : https://stackoverflow.com/questions/20283440/broadcast-receiver-is-taking-too-long-to-receive-in-onreceive-after-airplane-m

'Development > Android' 카테고리의 다른 글

Multipart used retrofit2  (0) 2018.05.16
Android Glide Proguard rules  (0) 2018.05.16
Multidex setting  (0) 2018.04.06
apk 파일 디컴파일 하기  (0) 2018.04.06
안드로이드 개발자라면 꼭 봐야할 사이트들  (0) 2018.04.02

multidex용 앱 구성


multidex 구성을 사용하도록 앱 프로젝트를 설정하려면 앱이 지원하는 최소 Android 버전에 따라 앱 프로젝트에서 다음 내용을 변경해야 할 수 있습니다.

minSdkVersion이 21 이상으로 설정되어 있을 경우 아래와 같이 모듈 수준의 build.gradle 파일에서 multiDexEnabled를 true로 설정하기만 하면 됩니다.

android {
    defaultConfig
{
       
...
        minSdkVersion
21
        targetSdkVersion
26
       
multiDexEnabled true
   
}
   
...
}

그러나 minSdkVersion이 20 이하로 설정되어 있으면 다음과 같이 multidex 지원 라이브러리를 사용해야 합니다.

  • multidex를 활성화하고 multidex 라이브러리를 종속성으로 추가할 수 있도록 아래와 같이 모듈 수준 build.gradle 파일을 변경합니다.

    android {
        defaultConfig
    {
           
    ...
            minSdkVersion
    15
            targetSdkVersion
    26
           
    multiDexEnabled true
       
    }
       
    ...
    }

    dependencies
    {
     
    compile 'com.android.support:multidex:1.0.1'
    }
  • Application 클래스 재정의 여부에 따라 다음 중 하나를 수행합니다.
    • Application 클래스를 재정의하지 않을 경우 매니페스트 파일을 편집하여 <application> 태그에서 android:name을 다음과 같이 설정합니다.

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         
      package="com.example.myapp">
         
      <application
                 
      android:name="android.support.multidex.MultiDexApplication" >
              ...
         
      </application>
      </manifest>
    • Application 클래스를 재정의할 경우 다음과 같이 MultiDexApplication을 확장하도록 변경합니다(해당할 경우).

      public class MyApplication extends MultiDexApplication { ... }
    • 또는 Application 클래스를 재정의하지만 기본 클래스를 변경할 수 없을 경우 attachBaseContext() 메서드를 재정의하고 MultiDex.install(this)을 호출하여 multidex를 활성화합니다.

      public class MyApplication extends SomeOtherApplication {
       
      @Override
       
      protected void attachBaseContext(Context base) {
           
      super.attachBaseContext(context);
           
      Multidex.install(this);
       
      }
      }

앱을 빌드할 때 Android 빌드 도구는 기본 DEX 파일(classes.dex)과 지원하는 DEX 파일(classes2.dexclasses3.dex 등)을 필요에 따라 구성합니다. 그 후 빌드 시스템이 모든 DEX 파일을 APK로 패키징합니다.

런타임에서 multidex API는 특수 클래스 로더를 사용하여 (기본 classes.dex 파일)에서만 검색하는 대신) 메서드에서 사용할 수 있는 모든 DEX 파일을 검색합니다.


출처 : https://developer.android.com/studio/build/multidex.html?hl=ko#avoid





dex2jar 를 이용해 apk 파일을 디컴파일 해 볼 수 있다.


d2j-dex2jar.bat -f -o [파일명].jar [APK 파일명].apk




ex... apk 파일 명이 abc일 경우.. abc.jar로 만들때


d2j-dex2jar.bat -f -o abc.jar abc.apk


-->> abc.jar 파일 생성됨.


이후


jd-gui

와 같은 툴을 이용해 보면 된다.

안드로이드 개발자라면 귀찮아도 모니터링 해야할 링크들을 모아보았습니다. 한글 사이트보다 영문이 많아 불편하실 수도 있습니다. 우리가 앞으로 좋은 한글 자료를 많이 만들었으면 좋겠습니다.

좋은 링크 소개해주시면 감사히 취합하도록 하겠습니다 🙂

자료

  • 안드로이드 개발자 공식 블로그 (영문)
    안드로이드 개발 공식 블로그이다. 안드로이드 스투디오 업데이트 뉴스외 다양한 안드로이드 관련 뉴스나 신규기능 소개 등의 글도 올라온다.
  • 안드로이드 개발자 공식 사이트 (영문)
    누구나 아는 사이트다. 안드로이드의 공식 문서 자료가 있다. API이나 대시보드를 참고하는데 많이 쓰지만, 둘러보면 권장 예제나 서포트 라이브러리 정보나 버그 리포팅 등의 정보도 잘 정리되어 있다. 최근에는 한글로 번역된 글도 늘어나고 있다.
  • 안드로이드 오픈소스 프로젝트 – 이슈 트랙커(영문)
    안드로이드 오픈소스 프로젝트의 이슈 트랙킹 사이트이다.  나는 실수한 것이 없는데, 이상하게 안된다 싶을 때 안드로이드의 버그인지 확인해보고 싶다면 이 사이트를 뒤져 보는 것을 추천한다. 전 세계의 개발자들이 이슈를 등록해서 안드로이드 팀을 괴롭히고 있으니까 내 궁금증이 이미 올라와 있는지 확인하자.
  • 스택오버플로우(영문)
    한국 사이트에서는 증상만 해결하는 미봉책들이 난무하지만, 스택오버플로우는 원인과 해결, 해결이 안된다면 이슈 트랙킹 정보라도 올라온다. 올바른 문제 해결을 원한다면 이 사이트를 참고하자. 물론, 모든 글이 좋은 건 아니다.
  • Udacity의 안드로이드 강좌(영문)
    구글 안드로이드 팀의 직강 안드로이그 강좌가 유다시티(Udacity)에 올라왔다. 초보자 강좌부터 모두 준비되어 있다고 하니, 들어보자.
  • 네이버 헬로우월드 블로그 (한글)
    네이버 개발자들이 직접쓰는 개발 경험과 지식이 담겨진 블로그다. 한국의 훌륭한 개발자들이 시간과 노력을 들여서 쓴 글들이니 꼭 읽어두자. 블로그에는 서버와 클라이언트, 그 밖에 다양한 개발 관련 글이 들어있는데 안드로이드 글만 참고하고 싶다면 여기를 확인하자.

커뮤니티

  • 수퍼드로이드 카페 (한국)
    이것이 안드로이드다‘(한빛출판사, 2014) 저자의 카페다. 책도 좋지만, 책이 없더라도 카페에 저자가 직접 올린 강좌들을 통해 많은 내용을 얻어갈 수 있다. 책에 대한 무료 동영상 강좌도 제공한다. 안드로이드에 대한 근본적인  동작 원리에 갈증이 나는 개발자라면 이 카페를 방문해보자. 아쉽게도 요즘은 카페가 조용하다. 일 년 내에는 곧 개정판이 나올 것 같으니 기다려보자.
  • 안드로이드 개발 팁팁팁! (한국)
    페이스북에 있는 안드로이드 개발자 커뮤니티다. 공개 커뮤니티로 검색해서 가입할 수 있으며, 최신 뉴스 정보나 질문에 대한 답변들도 서로 활발하게 달아준다.
  • GDG Korea Android의 채팅방(한국)
    GDG(Google Developer Group)의 안드로이드 채팅방이다. 사람도 많고 신입도 환영해 준다.  문답도 활발한 것 같다.

출처 : http://sunphiz.me/wp/archives/1567




'Development > Android' 카테고리의 다른 글

Multidex setting  (0) 2018.04.06
apk 파일 디컴파일 하기  (0) 2018.04.06
Android Badge Count Update  (0) 2018.04.02
Android Coroutine Recipes  (0) 2018.04.02
SQLite near distance query  (1) 2018.03.30

public class IconBadge {

/*****************************************
* 사용자 Static Method
*****************************************/
public static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}

//배지 카운트 업데이트
public static void updateIconBadge(Context context, int notiCnt) {
Intent badgeIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
badgeIntent.putExtra("badge_count", notiCnt);
badgeIntent.putExtra("badge_count_package_name", context.getPackageName());
badgeIntent.putExtra("badge_count_class_name", getLauncherClassName(context));
context.sendBroadcast(badgeIntent);
}

}


Android Weekly #303

Android Coroutine Recipes (www.youtube.com)

Android GDE Dmytro Danylyk presents on Kotlin coroutines.


Link

사용자 위경도 값을 이용해

DB에 저장되어있는 위경도와 비교해 가까운 순으로 정렬


SELECT (ABS(user.lat - A.LATITUDE) + ABS(user.lng - A.LONGITUDE)) * 100 as distance,A.FIRMNM FROM AllLottoStore as A

ORDER BY ABS(user.lat - A.LATITUDE) + ABS(user.lng - A.LONGITUDE) ASC

where distance < 1 


* 100 ==> km로 구분하기 위해..

*100 없어도 문제없음.



where distance < 1 

주변 1km 안에 있는 리스트.




추가 관련 사이트 링크




'Development > Android' 카테고리의 다른 글

Android Badge Count Update  (0) 2018.04.02
Android Coroutine Recipes  (0) 2018.04.02
Android SQLite 프로그램 다운로드 URL  (0) 2018.03.30
마켓 스크린샷 만들기 링크  (0) 2018.03.30
Android Study Link  (0) 2018.03.27

+ Recent posts