얼마전 회사에서 새로운 기능을 만들어서 배포 하였는데

 

현장 IE환경에서 특정 페이지가 구동이 안되는 현상을 발견 하였다.

무엇이 문제인가 하니

IE에서는 배열의 find를 지원하지 않았던것

그래서 찾은 해결방법이

<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=default,Array.prototype.includes,Array.prototype.find"></script>

 

를 추가 하는것이다.

 

IE에서 지원하지 않는 기능을 추가해주는 스크립트 이다.

 

역시 개발하면서 뭔가 불편하다 싶은게 있으면

 

누군가가 해결해 놓은 솔루션이 있기 마련이다.

 

[JAVA] VO리스트에 add로 값 넣고 싶을때


프로젝트마다 다른 방식이겠지만


나는 주로


1
2
List<dataVO> result  = null;
result =  service.loadData(vo);
cs


이런식으로 가져 오는 방식을 선호한다


그런데


1
2
3
4
5
6
7
8
9
10
11
 
List<dataVO> result = null;
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
cs


각각의 데이터들을 result에 넣고자 하면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
List<dataVO> result = null;
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
 
result.add(data1.get(0));
result.add(data2.get(0));
result.add(data3.get(0));
result.add(data4.get(0));
cs

이런식으로 넣으려 할텐데

저러면 에러가 난다


result가 null이기 때문이다


이때


result를


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
List<dataVO> result = new ArrayList();
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
 
result.add(data1.get(0));
result.add(data2.get(0));
result.add(data3.get(0));
result.add(data4.get(0));
cs



이렇게


new ArrayList(); 로 선언해주면


에러없이 값이 잘 들어간다.

[테라M] 구글 계정연동 오류 해결방법






구글 계정연동 오류 에러 나는 사람들을 위한 해결 방법입니다.


설정 -> 어플리케이션 관리자 에서


GOOGLE PLAY GAME를 찾습니다


거기에 사용제한이 걸려있는 경우 제한을 풀어주시면 됩니다.

[테라M] 에러코드 65538 계정연동 오류, 푸쉬알림 오류



현재 아이폰에서 발생하는 대표적인 오류 두가지는 


에러코드 65538 계정연동 오류, 푸쉬알림 오류 이 두가지일 것이다


푸쉬알림 오류는 일종의 권환오류중 하나라고 생각되어 진다.


녹스에서도 동일한 오류가 발생하고 아이폰에서 발생한다는 점에서


개인적인 뇌피셜로는 권한관련 오류일듯 한데


이건 금방 고쳐질것 같다. 게임하는데 지장도 없으니 큰 문제도 없는데


문제는


에러코드 65538이다


로그인 오류 : 앱에 로그인하시는데 오류가 발생했습니다. 나중에 다시 시도하세요



라는 문구가 나타나는데


안드로이드에서 계정연동 후


아이폰기기로 다시 계정 연동할때 나타나는 에러다



안드로이드에서 키워놓은거 폰바꿔서 아이폰으로 연동하려는데


그게 안되면


얼마나 빡치겠는가.



개인적인 해결 방법은



안드로이드에서 계정 연동을 먼저 했다 아이폰으로


옮겨야 하는경우




1. 아이폰에 설치된 테라의 캐쉬데이터를 전부 지우고 다시 연동을 시도 한다



2. 1번이 안되면  PC에 녹스 설치후 녹스에 테라M을 설치한 다음 녹스에서 페북 연동을해 캐릭터를 가져온다.

   그리고 그 이후 아이폰에서 페이스북 연동을 이용해 캐릭터 정보를 가져온다.(이때 녹스에서 페북연동을 해지하지 않습니다. 그냥

녹스만 종료하고 연동 ㄱㄱ)




위의 두가지 방법이 전부 안된다면...








첫 번째,

1. 설정>게임센터로 가서 현재 로그인하고 있는 Apple ID를 선택한 뒤 로그아웃합니다. 그리고 다시 로그인하세요.

2. iPhone/iPad를 강제로 재시동합니다(iPhone, iPad 또는 iPod touch 재시동하기 - Apple 지원에서 "강제로 재시동하기"를 참조하세요. 사과로고가 보일 때까지 홈버튼+잠자기버튼을 계속 누르고 있으면 강제 재시동이 됩니다.)

3. 설정>일반>날짜와 시간에서 "자동으로 설정(Set Automatically)"을 켬으로 합니다.

이 방법이 듣지 않는 사용자는 다른 방법을 다시 적용해 보세요.

 

두 번째,

1. iPhone/iPad에서 현재 구동중인 모든 앱을 닫습니다.

2. 에어플레인 모드로 변경합니다.

3. 전원을 껐다가 몇 분 기다린 뒤 다시 iPhone/iPad의 전원을 켭니다.

4. 설정>게임센터에서 현재 로그인되어 있는 Apple ID를 선택한 뒤 로그아웃합니다.

5. 에어플레인 모드를 해제하고, 다시 wifi를 활성화합니다.

6. 설정>게임센터에서 다시 로그인합니다.




OR


간단히는 설정>재설정>모든 설정 재설정


OR


아예 다른 Apple ID로 게임센터를 로그인하는 것만으로 문제가 해결되었다는 사람도 있습니다;


위의 방법까지 안된다면....

저도 방법이 없네요 ㅠ_ㅠ


하지만 게임 에러해결 전문가로 방법은 계속 찾아보도록 하겠습니다.


[테라M] 다운로드 에러코드 -10 해결 방법


모바일게임 초창기엔 


어딜가나 에러가 있기 마련이죠



저도 개발자이기 때문에


그리고 머드게임을 개발하고 운영하고 있는 사람이기에


어쩔수 없다는걸 알고 있습니다.


그리고 해결방법도 항상 존재하지요



이번엔 녹스같은 앱플레이어를 사용할때 나타나는


다운로드중 발생하는 에러코드 -10에 대한 해결 방법에 대해 알아보겠습니다.





지금은 해결되고 업데이트가 되었는진 모르지만


녹스에서 발생하는 다운로드 에러 사항에 대한 해결 방법으론



전통적으로 인터넷이 연결되는 경로를 바꾸는 것입니다.


방법은


.



1. 만약 와이파이로 연결주이었다면 직접 LAN선을 꽂아서 사용하기


2. 랜선연결이라면 와이파이로 잡아놓고 다운받기


3. 1.2 둘다 안된다면 핸드폰 핫스팟을 켜고 다운 받아보기


4. 1,2,3 전부 안된다면 외부 인터넷 ( 마트 공용 와이파이라던가... 다른 장소)을 사용하여 다운 받아보기


5. 랜선을 다 뽑고 공유기와 모뎀전원을 껏다가 킨 후 다운 받아보기




위의 5가지 방법중에 하나론 해결이 됩니다.


개인적인 견해론 다운로드중 방화벽에 막히거나


패킷오류가 났다거나 혹은


서버에서 데이터를 다운 받는중에 인증문제가 발생했다거나 인것 같은데


워낙 다양한 경로에서 에러가 날 수 있어서 정확하겐 모르겠네요


만약 에러코드 -10이 나타났다면 위의 방법을 이용해 해결할 수 있으면 좋겟습니다.





- 아룬서버 <무서운언니들> 길드에서 혈원 모집 하는 중입니다. 길드원끼리 다양한 정보를 공유 할 수 있어요~

가입요청 부탁 드립니다!

[안드로이드] duplicate entry 에러 해결 방법



Error:Execution failed for task 에러를 해결하니 이번엔 중복에러가 나타났다



duplicate entry: com/google/zxing/aztec/AztecDetectorResult.class


이런 에러인데


AztecDetectorResult 클래스가 중복이 되었다 뭐 그런 이야기다



구글의 라이브러리를 이것저것 참조하다보면 저런 에러가 흔히 나타나는듯 하다.


나같은 경우는


QR코드를 읽는 라이브러리와


안드로이드 카메라로 촬영한 이미지의 문자를 인식하는 라이브러리를 사용하던 중에


이것저것 끌어오다가 나타난 에러였다.



어느부분에서 중복되었는지 찾기가 쉽지는 않지만


어차피 앞쪽의 경로를 보면 대충 사이즈는 나오니까 잘 찾아보도록 하자









안드로이드 스튜디오의 프로젝트보기로 (안드로이드 보기론 안보임)


저 두군데를 뒤져보면 중복되는 녀석들이 나타난다



단순히 build.gradle에서 컴파일 명령을 지우는 것 만으로는 해결이 되지 않기 때문에


직접 저기서 파일 자체를 삭제 해주어야 한다.



물론 아무거나 지우다 일어나는 일은 책임 못진다.



build.gradle에서 명령줄만 삭제 해보고 



정상 동작 한다면 그떄 지우고 APK파일로 구동시켜 보도록 하자.




단순히 빌드할땐 나타나지 않다가 APK파일로 생성할때 나타나는 에러니까


정상동작하는걸 확인 후 삭제하는 것으로 



저 에러를 해결 하자



[안드로이드] Error:Execution failed for task ':app:transformClassesWithDexForDebug'. 오류 해결 방법



신나게 코딩하고나서 모바일로 테스트 까지 다 해놓고


APK파일로 묶으려는데 저런 에러가 나서 당황스러운 경우가 있었다.



대체 뭐지.. 뭘까..


하고 뒤쪽의 에러를 더 봤더니



com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: 

com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;



이런 내용의 로그가 나타났고


저기서 잘 보아야 할것은


Multiple dex files define 


바로 이부분이었다


음... 뭐 다중 어쩌구 파일을 못찾겠다 뭐 이런건지


일단 잘 모르니까 검색을 해보니


역시나 스택오버플로우 형님들이 좋은 답변들을 알려주었다



안드로이드 build.gradle (app 레벨)에 들어가서


몇줄 추가해 주도록 하자


dependencies {
compile 'com.android.support:multidex:1.0.1'
}


디펜던시에서 저 한줄을 추가 해주고



android {

.......
defaultConfig {

.........
multiDexEnabled true
}

.....
}


저렇게 하나 추가해 주도록 하자



그리고 AdnroidManifest.xml에 가서


<application
.....
android:name="android.support.multidex.MultiDexApplication">

......
</application>


어플리케이션단에 추가를 해준다



그럼 해결이 된다!

[톰캣] 서버 실행시 CMD창 바로 사라지는 문제 해결 방법






톰캣의 startup.bat 파일을 실행시킬때


cmd창이 떳다가 바로 사라지는 경우가 있었다.


뭐 에러 메세지라도 보여야 뭐가 잘못된건지 볼텐데


로그도 쌓이지 않고 그냥 사라져 버리는 문제에 대한 해결 방법이다.



일단 일반 cmd 창을 띄우고


톰캣이 설치된 경로로 이동한다



C:\apache-tomcat-7.0.76-windows-x64\apache-tomcat-7.0.76\bin



빈폴더 까지 이동 후


startup.bat  명령어를 입력하면


메세지가 나타나게 되는데


JRE_home environment variable is not defined correctly

a fatal exception has occurred. program will exit


요런 메세지가 나타난다.


JRE_home 가 아니라 JAVA_HOME 가 나타날 수도 있다


혹은 그외의 메세지가 나타날 수도 있으니


해당 메세지를 보고 오류를 해결하면 된다.


JRE_home environment variable is not defined correctly


이런 오류 메세지가 나타날떄의 해결 방법은


톰캣 bin 폴더의 catalina.bat 파일을 편집기로 열어서


JRE_HOME 나 JAVA_HOME의 경로를 


재지정 해주면 된다.



만약 JRE_HOME이나 JAVA_HOME 에 $JRE_HOME$ 이런 식으로


지정이 되어 있다면


시스템변수에 JAVA_HOME이나 JRE_HOME이 정상적으로


등록이 되어 있는지 확인 한다.



나의 경우는 JRE_HOME을 따로 지정하지 않았는데


톰캣 카탈리나에 JRE_HOME이 $JRE_HOME$ 으로 지정이 되어 있어서


시스템 변수에 JRE_HOME을 등록해 주고 난 후 오류를 해결 했다.



.




혹은 톰캣 윈도우를 실행 할때


지정된 서비스가 설치된 서비스로는 없습니다.


라는 메세지가 뜨는 경우


CMD창을 열어서


톰캣 빈폴더로 이동 후


service.bat install tomcat7


이라는 명령어를 입력하면


해결이 된다.






[안드로이드] 기기의 카메라에 오류가 생겼습니다. 기기를 재시작해야할수도있습니다. 해결방법 






QR코드나 BAR코드 리딩 기능을 넣거나


OCR 문자 인식 관련해서 API 23 이상부터 나타나는 에러이다


해결방법은 간단하다


API23 이전엔 그냥 매니페스트에 권한요청만 하면 되었는데


API23 이후부터는 아얘 권한 요청 팝업을 띄워서


허용을 받아야 한다.


해결방법은 어디서 찾아다가 프로젝트에 적용시켰는데 어디서 본건지 기억이 잘 안난다;





해결 방법은 아래와 같다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        /**********권한 요청************/
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            /**
             * 사용자 단말기의 권한 중 "카메라" 권한이 허용되어 있는지 확인한다.
             *  Android는 C언어 기반으로 만들어졌기 때문에 Boolean 타입보다 Int 타입을 사용한다.
             */
            int permissionResult = checkSelfPermission(Manifest.permission.CAMERA);
 
 
            /** * 패키지는 안드로이드 어플리케이션의 아이디이다. *
             *  현재 어플리케이션이 카메라에 대해 거부되어있는지 확인한다. */
            if (permissionResult == PackageManager.PERMISSION_DENIED) {
 
 
                /** * 사용자가 CALL_PHONE 권한을 거부한 적이 있는지 확인한다. *
                 * 거부한적이 있으면 True를 리턴하고 *
                 * 거부한적이 없으면 False를 리턴한다. */
                if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
                    AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                    dialog.setTitle("권한이 필요합니다.").setMessage("이 기능을 사용하기 위해서는 단말기의 \"카메라\" 권한이 필요합니다. 계속 하시겠습니까?")
                            .setPositiveButton("네"new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
 
                                    /** * 새로운 인스턴스(onClickListener)를 생성했기 때문에 *
                                     * 버전체크를 다시 해준다. */
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        // CALL_PHONE 권한을 Android OS에 요청한다.
                                        requestPermissions(new String[]{Manifest.permission.CAMERA}, 1000);
                                    }
                                }
                            })
                            .setNegativeButton("아니요"new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Toast.makeText(MainActivity.this"기능을 취소했습니다", Toast.LENGTH_SHORT).show();
                                }
                            }).create().show();
                }
                // 최초로 권한을 요청할 때
                else {
                    // CALL_PHONE 권한을 Android OS에 요청한다.
                    requestPermissions(new String[]{Manifest.permission.CAMERA}, 1000);
                }
            }
            // CALL_PHONE의 권한이 있을 때
            else {
 
            }
        }
        /************권한요청 끝**************/
 
 
    }
 
 
 
/** * 권한 요청에 대한 응답을 이곳에서 가져온다. * *
     *  @param requestCode 요청코드 *
     *  @param permissions 사용자가 요청한 권한들 *
     *  @param grantResults 권한에 대한 응답들(인덱스별로 매칭) */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1000) {
            // 요청한 권한을 사용자가 "허용" 했다면...
            if (grantResults.length > 0 && grantResults[0== PackageManager.PERMISSION_GRANTED) {
                // 이곳에 허용했을때 실행할 코드를 넣는다
                // 근데 난 안넣음
 
            } else {
                // 거부했을때 띄워줄 
                Toast.makeText(MainActivity.this"권한요청을 거부했습니다.", Toast.LENGTH_SHORT).show();
            }
        }
    }
 
 
cs



액티비티에서 onCreate 부분에서 권한요청을 날려주면 된다.


메인액티비티에 걸어놨다면 어플을 실행할때 메세지가 뜰 것이다.


최적화를 위해서는


권한이 필요한 액션이 일어날때 권한요청을 물어보는 것이 좋다고 하는데


내가 하는 프로젝트는 웹뷰로 띄워놓고 하는거라


액티비티가 메인액티비티 하나뿐이다.


그리고 귀찮다.



만약 카메라 권한이 아니라 


전화걸기, 데이터접근 등의 권한이라면



Manifest.permission.CAMERA


이부분에서


CAMERA 만 원하는 퍼미션으로 바꿔주면 된다.


물론 하나만 바꾸는게 아니라 저거 적혀있는 모든 코드를 바꿔야 하는건 기본





[안드로이드] androidBridge they will not be visible in API 17 오류 해결 방법




none of the methods in the added interface(androidBridge) have been annotated with @android.webkit   they will not be visible in API 17 


이 오류의 해결 방법 입니다.



1. 원인


안드로이드 버전 API 17 이상부터 androidBridge 사용시 메소드에 어노테이션을 사용해야 정상 구동 하도록

바뀌어서 생기는 오류


2. 해결 방법


간단하게 androidBridge에서 사용하는 메소드위에 어노테이션을 추가 하면 됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.xxx.xxxx;
 
import android.os.Handler;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * Created by Administrator on 2017-08-03.
 */
 
public class AndroidBridge {
    private final Handler handler = new Handler();
    private WebView mWebView;
    private DBHelper dbHelper;
    private  boolean newtwork;
 
    // 생성자
    public AndroidBridge(WebView mWebView, DBHelper dbHelper, boolean newtwork) {
        this.mWebView = mWebView;
        this.dbHelper = dbHelper;
        this.newtwork = newtwork;
    }
 
    // 네트워크 상태 확인
    @JavascriptInterface
    public void requestNetwork() { // must be final
        handler.post(new Runnable() {
            public void run() {
                Log.d("HybridApp""네트워크 상태 요청");
                mWebView.loadUrl("javascript:getNetwork("+newtwork+")");
            }
        });
    }
 
 
 
    @JavascriptInterface
    public void setMessage(final String arg) { // must be final
        handler.post(new Runnable() {
            public void run() {
                Log.d("HybridApp""setMessage("+arg+")");
                mWebView.loadUrl("javascript:getAndroidMessage('ANDROID -> JAVASCRIPT CALL!!')");
            }
        });
    }
 
 
}
cs


간단하게 다른거 볼 필요 없이


28번라인에 추가한 어노테이션을 29번같은 메소드 위에 선언하기만 하면 해당 오류가 해결 된다.



+ Recent posts