"AppUpdateManager 를 이용한 앱 업데이트" 를 이용해 보시는건 어떠신가요?
아래 링크를 클릭해 보세요.
https://snowbike.tistory.com/76
=======================================================
안드로이드 앱을 구글플레이에 업로드 후 앱 버전이 올라갔을때,
앱 업데이트 확인을 위해서 "구글플레이" 정보를 파싱해서 구글플레이 버전과 디바이스 버전을 비교하는 방식을 사용했었다.
그런데, 2018년 3~4월 경 부터 해당 기능이 정상적으로 동작하지 않았다.
"구글플레이" 사이트 구성이 약간 변경된것으로 판단됩니다.
그래서 새로 만들어서 테스트했는데, 정상적으로 동작해서, 참고하고자 작성한다.
기존에는 softwareVersion 을 찾아서 처리했으나, 이번에는 htlgb 클래스를 이용한다.
jericho htmlparser 는 아래에서 다운로드한다.
https://sourceforge.net/projects/jerichohtml/files/jericho-html/3.4/jericho-html-3.4.zip/download
하지만, 임시조치이며 결과적으로
Firebase 원격구성 firebase-config 을 사용하거나 자체서버를 만들어서 API를 통한 서비스를 하는것을 권장합니다.
또 언제 바뀔지 모르니...
=============================================================
package com.test;
import android.content.Context;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
public class MarketVersion {
public static String TAG = "MarketVersion";
/**
* 구글플레이에서 앱 버전 정보를 가져와서 기기 앱 버전과 비교한다. (play.google.com)
* 앱 버전은 "1000.1.1.1" 인 "4자리.1자리.1자리.1자리" 형식으로 구성해야 한다.
* 앱 버전 형식은 "형식 수정하는곳" 라인 코드를 변경하여 임의로 변경이 가능하다.
* 참고 사이트 https://stackoverflow.com/questions/49441843/google-playstore-app-version-check-not-working-any-more
* jericho htmlparser를 이용하며, 다른 파서를 응용하면 가능하다.
*
* @param context
* @return bVersionCheck 마켓버전이 높은 경우 true 리턴, 동일하거나 디바이스 버전이 높은 경우, 오류시 false 리턴
*/
public static boolean getMarketVersion(Context context) throws Exception {
boolean bVersionCheck = false; // 마켓버전이 높은 경우 true 리턴, 동일하거나 디바이스 버전이 높은 경우 false 리턴한다.
try {
String sUrl = "https://play.google.com/store/apps/details?id=" + context.getPackageName() + "&hl=en";
Source source = new Source(getStringFromURL(sUrl, "UTF-8"));
source.fullSequentialParse();
List<Element> Version = source.getAllElementsByClass("htlgb");
String sMarketVersion = ""; // 마켓 버전
int[] iMarketVersion = new int[4];
for (int i = 0; i < Version.size(); i++) {
String sTxt = Version.get(i).getTextExtractor().toString().trim();
if (Pattern.matches("^[0-9]{4}.[0-9]{1}.[0-9]{1}.[0-9]{1}$", sTxt)) { // 형식 수정하는곳
sMarketVersion = sTxt;
break;
}
}
if (sMarketVersion.length() < 1) {
throw new Exception("마켓 버전 sMarketVersion.length가 1보다 작음");
}
StringTokenizer sMvTxt = new StringTokenizer(sMarketVersion, ".");
int iMvCnt = 0;
while (sMvTxt.hasMoreElements()) {
String sToken = sMvTxt.nextToken();
if (sToken.length() > 0) {
iMarketVersion[iMvCnt] = Integer.valueOf(sToken);
}
iMvCnt++;
}
String sDeviceVersion = ""; // 디바이스 버전
int[] iDeviceVersion = new int[4];
try {
sDeviceVersion = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
} catch (Exception e) {
e.printStackTrace();
}
if (sDeviceVersion.length() < 1) {
throw new Exception("디바이스 버전 sDeviceVersion.length가 1보다 작음");
}
StringTokenizer sDvTxt = new StringTokenizer(sDeviceVersion, ".");
int iDvCnt = 0;
while (sDvTxt.hasMoreElements()) {
String sToken = sDvTxt.nextToken();
if (sToken.length() > 0) {
iDeviceVersion[iDvCnt] = Integer.valueOf(sToken); // 배열변수에 넘버를 하나씩 넣는다..
}
iDvCnt++;
}
for (int n = 0; n < 4; n++) {
if (iMarketVersion[n] > iDeviceVersion[n]) {// iMarketVersion 마켓버전, iDeviceVersion 디바이스버전 비교
bVersionCheck = true;
break;
} else if (iMarketVersion[n] < iDeviceVersion[n]) {
break;
}
}
Dlog.i(TAG, "MarketVersion.java | getMarketVersion| 마켓버전 iMarketVersion= " + Arrays.toString(iMarketVersion));
Dlog.i(TAG, "MarketVersion.java | getMarketVersion| 디바이스버전 iDeviceVersion= " + Arrays.toString(iDeviceVersion));
} catch (Exception e) {
e.printStackTrace();
}
Dlog.i(TAG, "MarketVersion.java | getMarketVersion (line 160) | = " + (bVersionCheck ? "마켓버전 높음" : "마켓버전 동일 or 낮음 or 오류 발생"));
return bVersionCheck;
}
/*
* HttpURLConnection 를 이용한다.
*/
private static String getStringFromURL(String sURL, String charsetName) throws Exception {
StringBuffer sbResult = new StringBuffer();
BufferedReader br = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sURL);
connection = (HttpURLConnection) url.openConnection();
if (connection != null) {
connection.setConnectTimeout(3000);
connection.setReadTimeout(3000);
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
connection.setUseCaches(false);
connection.setDefaultUseCaches(false);
connection.connect();
int status = connection.getResponseCode(); // HTTP 상태코드
if (status == HttpURLConnection.HTTP_OK) {
br = new BufferedReader(new InputStreamReader(connection.getInputStream(), charsetName));
String strLine = null;
while ((strLine = br.readLine()) != null) {
sbResult.append(strLine + "\n");
}
br.close();
} else {
throw new UnknownHostException("UnknownHostException response status: " + status);
}
connection.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (connection != null) {
connection.disconnect();
}
if (br != null) {
br.close();
}
}
return sbResult.toString();
}
}
'android' 카테고리의 다른 글
AppUpdateManager 를 이용한 앱 업데이트 (2) | 2019.07.04 |
---|---|
APK 파일 재서명하기, APK Resigning (0) | 2018.01.21 |
android studio 3.0에서 xml layout 정상적으로 안 보일때, XML Preview 오류 (10) | 2017.11.02 |
Android Studio 한글 깨짐 해결 (0) | 2017.09.07 |
Android Studio 한글 깨짐 (5) | 2016.04.17 |