안드로이드 푸시 (android push) MismatchSenderId  오류


 

 안드로이드의 푸시를 하다보면 많은 오류를 발생하는데,


 안드로이드 푸시 (android push) Unauthorized Error 401 오류


 오류를 겨우겨우 해결했더니 다음으로 나오는게, MismatchSenderId 오류...


 이 오류는 클라이언트에서 등록된 senderId가 일치 하지 않는다는 것입니다.


 그래서 결국엔 sender Id 받고 다시 하니 되네요,


 원 한번에 되는게 없네..ㅠ 


 

안드로이드 GCM PUSH 인증 받기 v.2015.06.16

 



 안드로이드 푸시 (android push) Unauthorized  Error 401 오류


 오류는 구글에 등록된 key 가 일치되지 않을경우 발생됩니다.


 체크해야 할부분은 구글에서 발급받은 key가 정상적으로 입력되었는지 체크하시고,


 구글에서 발급받은직후 바로 테스트하면 바로 업데이트가 되지 않아 발생되는 경우도 생깁니다.


 이럴땐 10~20분정도 기다리고 다시 테스트 하시면 정상적으로 됩니다.


 만약 그래서 똑같은 오류가 발생된다면 공개 api 액세스 key 를 삭제후에 키를 새로 발급받고


 10~20분 기다리고 테스트하시면 됩니다.




 안드로이드 사용시 자주 발생되는 out of memory 에 한가지 해결 방법



 SoftReference 



 메모리가 부족할경우, 담겨져 있는 데이터의 메모리를 비워 사용에 필요한 메모리를 확보한다.





HashMap<String, SoftReference<Bitmap>> bitmapMap = new HashMap<String,                                                         SoftReference<Bitmap>>();


bitmapMap.put(key, new SoftReference<Bitmap>(value));




android:adjustViewBounds="true"

<ImageView android:layout_width="match_parent" android:layout_height="wrap_content"  

            android:adjustViewBounds="true" />



 androidannotations 에서 많이 사용되는것 위주로 정리해 두겠습니다.





 1. @EActivity


 안드로이드에서 가장 많이 사용되는 어노텐션입니다.


 androidannotations 을 사용하는 activity를 명령하는 어노텐션 입니다.


@EActivity

public class MainActivity extends Activity {


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

}


 위와 같이 명명 하시면 됩니다.


 또한 layout과 같이 사용하시려면 


 

@EActivity( R.layout.activity_main )

public class MainActivity extends Activity {


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

}



 내용 처럼 @EActivity( R.layout.activity_main ) 으로 사용 하시면 됩니다.


 이렇게 적용하신 다음에


 mainifests에서 activity 명을 activity_ 으로 수정해주시면 됩니다.




 변경해 주시면 오류가 뜨는데 이때 Build > rebuild project 하시면 오류가 사라집니다.



 rebuild project를 하시면 보이지는 않지만 androidannotations에서 자동으로


 "activity_" 라는 클래스를 생성하기때문에 정상적으로 표시되는 것을 확인하실수있습니다.


 




 2. @AfterViews


@AfterViews는 view에 대한 모든 내용이 완료된 이후에 호출됩니다.



@EActivity( R.layout.activity_main )

public class MainActivity extends ActionBarActivity {



    @AfterViews

    protected void init()

    {

    }

}



 위 처럼 사용하시면 됩니다.


 주의 하실점은 androidannotations에서 MainActivity_라는 클래스를 생성하여


 MainActivity에 접근하기때문에 private를 사용할경우 오류가 발생합니다.


 public 또는 protected 만 사용이 가능합니다.





 3, @ViewById


 @ViewById는 안드로이드에서 사용했던 findViewById의 절차를 간소한 어노텐션입니다.


protected TextView tvMain;


    @Override

    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {

        super.onCreate(savedInstanceState, persistentState);

        tvMain = (TextView) findViewById( R.id.tvMain );

    }



 처럼 사용했던 기존에 방식에서 @ViewById를 사용함으로써 간소화 하는 방식입니다.



 사용법은


     @ViewById

    protected TextView tvMain;


 처럼 사용하시면 됩니다. 위처럼 사용하시면 R.id.tvMain 이란 객체를 찾아 tvMain 변수에 넣어줍니다.



    @ViewById ( R.id.tvMain )

    protected TextView tvMain;



 또한 위처럼도 사용이 가능합니다.




 4. @Click

 

 기존에 사용하던 버튼을 사용하던 방식에서 크게 간소화 되었습니다.


protected TextView tvMain;


    @Override

    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {

        super.onCreate(savedInstanceState, persistentState);

        tvMain = (TextView) findViewById( R.id.tvMain );

        tvMain.setOnClickListener( new View.OnClickListener(){

            @Override

            public void onClick(View v) {

                Log.i(TAG , "tvMainClick");

            }

        });

    }


 

 사용 방식은

 

@Click( R.id.tvMain )

    protected void tvMainClick()

    {

        Log.i(TAG , "tvMainClick");

    }


 입니다. 기존에 사용할때, 아이디 지정및 객체 생성등의 필요없는


 내용이 사라짐으로써 코드량이 확 주는 것을 확인 하실수 있습니다.





 안드로이드 스튜디오( Android Studio )에다가 androidannotations 적용하기가 여간 까다롭네요.


 이전에 올라왔던 글들을 보면 업데이트가 되서 그런지 않되는 경우가 많이 있구요,


 그래서 최신버전으로 다시 적용 방법을 보겠습니다.


 이글은 2015-05-04일에 작성되었습니다.


 

 우선 프로젝트를 생성한 이후 Gradle Scripts를 확인해 보시면 build에 관련하여


 두개의 gradle을 확인 하실 수있습니다.




 두개의 gradle중 Module: app 을 선택하여 진입합니다.



 


 프로젝트 생성시 기본적인 셋팅이 되어있는 것을 확인 하실수 있습니다.


 우리는 androidannotations를 셋팅하기위해서 gradle 의 내용을 바꾸어 줘야 합니다.


 


buildscript {

    repositories {

        mavenCentral()

    }

    dependencies {

        // replace with the current version of the Android plugin

        classpath 'com.android.tools.build:gradle:1.0+' // 버전에 맞게 변경.

        // the latest version of the android-apt plugin

        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

    }

}


repositories {

    mavenCentral()

    mavenLocal()

}


apply plugin: 'android'

apply plugin: 'android-apt'

def AAVersion = '3.3' // 현재 최신버전 3.3으로 되어있으나 버전에 따라 변경.


dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:appcompat-v7:22.0.0'

    apt "org.androidannotations:androidannotations:$AAVersion"

    compile "org.androidannotations:androidannotations-api:$AAVersion"

    compile 'org.androidannotations:androidannotations:3.3'

}


apt {

    arguments {

        androidManifestFile variant.outputs[0].processResources.manifestFile

        resourcePackageName '[현재 프로젝트의 패키지]'

    }

}


android {

    compileSdkVersion 21

    buildToolsVersion '22.0.1'


    defaultConfig {

        applicationId "[현재 프로젝트의 패키지]"

        minSdkVersion 9

        targetSdkVersion 21

        versionCode 1

        versionName "1.0"

    }


    buildTypes {

        release {

            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'),

                    'proguard-rules.txt'

        }

    }


    packagingOptions {

        exclude 'META-INF/ASL2.0'

        exclude 'META-INF/LICENSE'

        exclude 'META-INF/license.txt'

        exclude 'META-INF/NOTICE'

        exclude 'META-INF/notice.txt'

    }


    sourceSets {

        main {

//            manifest.srcFile 'src/main/AndroidManifest.xml'

//            java.srcDirs = ['src/main/java']

//            resources.srcDirs = ['src/main/resources']

//            res.srcDirs = ['src/main/res']

//            assets.srcDirs = ['src/main/assets']

        }

    }




위에 내용으로 바꾸어 줍니다.


 버전에 맞게 내용을 변경 하시면 됩니다.


 그리고 [현재 프로젝트의 패키지]를 자신의 프로젝트에 맞게 변경하시면 됩니다.


 제가 사용하는 패키지는 "tc.wo.mbseo.applyandroidannotations" 이기 때문에 맞게 변경합니다.



apt {

    arguments {

        androidManifestFile variant.outputs[0].processResources.manifestFile

        resourcePackageName 'tc.wo.mbseo.applyandroidannotations'

    }

}



defaultConfig {

        applicationId "tc.wo.mbseo.applyandroidannotations"

        minSdkVersion 9

        targetSdkVersion 21

        versionCode 1

        versionName "1.0"

    }

 


 

 저장한 이후 rebuild project 합니다.

 




 이제 실행하시면 됩니다.






 위와 같이 나오면 정상적으로 적용된것입니다.





build.gradle 파일 수정





buildscript {

    repositories {

        mavenCentral()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:1.0.0'

        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

    }

}


repositories {

    mavenCentral()

    mavenLocal()

}


apply plugin: 'com.android.application'



dependencies {

    compile fileTree(include: ['*.jar'], dir: 'libs')

    compile 'com.android.support:appcompat-v7:22.0.0'

    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'

}


apt {

    arguments {

        androidManifestFile variant.outputs[0].processResources.manifestFile

        resourcePackageName 'tc.wo.mbseo.springtest'

    }

}


android {

    compileSdkVersion 21

    buildToolsVersion "22.0.1"


    defaultConfig {

        applicationId "tc.wo.mbseo.springtest"

        minSdkVersion 9

        targetSdkVersion 21

        versionCode 2

        versionName "1.1"

    }


    buildTypes {

        release {

            minifyEnabled  false

            proguardFiles getDefaultProguardFile('proguard-android.txt'),

                    'proguard-rules.txt'

        }

    }


    packagingOptions {

        exclude 'META-INF/ASL2.0'

        exclude 'META-INF/LICENSE'

        exclude 'META-INF/license.txt'

        exclude 'META-INF/NOTICE'

        exclude 'META-INF/notice.txt'

    }

Structure

    sourceSets {

        main {

        }

    }

}



 이후 Build -> Rebuild Project 




Idpi , mdpi , hdpi , xhdpi 의 해상도별 사이즈

  • ldpi: 200x320
  • mdpi: 320x480
  • hdp: 480x800
  • xhdpi: 720x1280
  • ldpi landscape
  • mdpi landscape
  • hdp landscape
  • xhdpi landscape


출처 : http://blog.iolo.kr/archive/201401



Idpi , mdpi , hdpi , xhdpi 의 해상도별 비율.




ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi
0.75 | 1    | 1.5  | 2     | 3      | 4


출처 : http://developer.android.com/guide/practices/screens_support.html


 

Resizer_1.3.1.exe



 

 안드로이드를 해상도별로 대응하다보면 하나의 이미지를 다른 해상도에 맞게 변환하여


 mdpi , Idpi , hdpi xhdpi xxhdpi 등의 사이즈로 변하여 넣어주게 되는데,


 이미지를 하나하나 작업하다보면 시간이 너무 오래 걸리기 마련이죠,


 그래서 괜찮은 툴이 있어 소개해드립니다.


 





9Patch Resizer 인데요, 사용법은 간단합니다.


이미지를 작업할때 기준이 된 사이즈를 Input density에 선택한후


내가 필요한 사이즈를 체크하시면 됩니다.






이후에 drag하여 하나의파일 또는 선택된 여러 파일을 Drop xhdpi image here에 가져다 놓으면 됩니다.


그러면, 모든 작업은 완료됩니다.






이제 이미지를 붙여 넣으시면 됩니다.






Error:(1) Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.





build.gradle (Module: app) 에서 dependencies 값에 


    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:appcompat-v7:22.0.0'


값 추가하면 정상 동작합니다.


dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:appcompat-v7:22.0.0'

}


+ Recent posts