IT/안드로이드

안드로이드 버전 체크 자동업데이트 강제업데이트

조원태 2016. 12. 19. 16:45
반응형
안드로이드 버전 체크 자동업데이트

앱을 만들다보면 정기적으로 구글 플레이스토어에 등록하게 됩니다.

구글 플레이스토어 어플에서 새로 등록된 어플이 있으면 자동으로 업데이트를 해줍니다.


하지만 클라이언트 중에는 그 시간도 못 참거나 네이티브적으로 심각할 경우 강제로 업데이트를

진행해야 할 경우가 있습니다.



아래 소스를 MainActivity.java에 넣습니다.

참고로 아래 소스는 다른 블로그에서 가져온것인데. 그 블로그에서 나와 있는 소스에 오류가 있어서 수정하여 포스팅 한 것입니다. 에러가 무엇이냐면 storeVersion 변수를 전역변수로 선언하고

BackgroundThread 클래스에서 지역변수로 선언하여

제대로 실행되지 않는 부분을 수정했습니다.

//버전체크

public class BackgroundThread extends Thread {
@Override
public void run() {

// 패키지 네임 전달
storeVersion = MarketVersionChecker.getMarketVersion(getPackageName());

// 디바이스 버전 가져옴
try {
deviceVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
deviceVersionCheckHandler.sendMessage(deviceVersionCheckHandler.obtainMessage());
// 핸들러로 메세지 전달
}
}

private final DeviceVersionCheckHandler deviceVersionCheckHandler = new DeviceVersionCheckHandler(this);

// 핸들러 객체 만들기
private static class DeviceVersionCheckHandler extends Handler{
private final WeakReference<MainActivity> mainActivityWeakReference;
public DeviceVersionCheckHandler(MainActivity mainActivity) {
mainActivityWeakReference = new WeakReference<MainActivity>(mainActivity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = mainActivityWeakReference.get();
if (activity != null) {
activity.handleMessage(msg);
// 핸들메세지로 결과값 전달
}
}
}

private void handleMessage(Message msg) {
//핸들러에서 넘어온 값 체크
Log.e( " storeVersion : ", storeVersion);
Log.e( " deviceVersion : ", deviceVersion);
if (storeVersion.compareTo(deviceVersion) > 0) {
// 업데이트 필요

AlertDialog.Builder alertDialogBuilder =
new AlertDialog.Builder(new ContextThemeWrapper(this, android.R.style.Theme_DeviceDefault_Light));
alertDialogBuilder.setTitle("업데이트");alertDialogBuilder
.setMessage("새로운 버전이 있습니다.\n보다 나은 사용을 위해 업데이트 해 주세요.")
.setPositiveButton("업데이트 바로가기", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(intent);
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.setCanceledOnTouchOutside(true);
alertDialog.show();

} else {
// 업데이트 불필요

}

2. MarketVersionChecker 자바 클래스를 만듭니다.


import android.util.Log;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MarketVersionChecker {
public static String getMarketVersion(String packageName) {

Log.d("받은 값", packageName);

try {
Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + packageName).get();
Elements Version = document.select(".content");
for (Element element : Version) {
if (element.attr("itemprop").equals("softwareVersion")) {
return element.text().trim();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}

public static String getMarketVersionFast(String packageName) {

String mData = "", mVer = null;

try {
URL mUrl = new URL("https://play.google.com/store/apps/details?id=" + packageName);

HttpURLConnection mConnection = (HttpURLConnection) mUrl.openConnection();
if (mConnection == null) {
return null;
}

mConnection.setConnectTimeout(5000);
mConnection.setUseCaches(false);
mConnection.setDoOutput(true);

if (mConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mConnection.getInputStream()));
while(true) {
String line = bufferedReader.readLine();
if (line == null)
break;
mData += line;
}
bufferedReader.close();
}
mConnection.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}

String startToken = "softwareVersion\">";
String endToken = "<";
int index = mData.indexOf(startToken);

if (index == -1) {
mVer = null;
} else {
mVer = mData.substring(index + startToken.length(), index + startToken.length() + 100);
mVer = mVer.substring(0, mVer.indexOf(endToken)).trim();
}
return mVer;
}
}

위 소스를 삽입합니다.



위 소스는 jsoup이라는 것을 이용해서 html 문서를 파싱하기 때문에 라이브러리를 추가 해줘야 합니다.

3. build.gradle 파일에

dependencies에 compile 'org.jsoup:jsoup:1.8.3' 추가 해줍니다.

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.jsoup:jsoup:1.8.3'
}


반응형