상세 컨텐츠

본문 제목

안드로이드 개발 ▶안드로이드 어플 업데이트, 업그레이드 방법!!! 업데이트 관리, 최신버전 알림 MarketSession

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2020. 9. 21. 02:22

본문

반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

MarketSession을 쓰기위해선 AsyncTask 비동기처리안에서 구동해야 한다.

AsyncTask에 대한것은 아래 링크에 기재해 두었다.

http://202psj.tistory.com/798

 

MarketSession 쓰기전에 자신 구글 계정 보안상태를 확인해 주세요

https://myaccount.google.com/

여기 주소로 자기 계정의 보안 상태를 알수 있습니다 아래 그림 보시고 참고 하시면 됩니다,.

 

 

 

보안수준이 낮은 엑세스 "사용 안함" -> "사용" 으로 바꾸어주어야

MarketSession session = new MarketSession();

session.login("구글계정", "계정비번");

이부분이 동작이 제대로 됩니다.

 

그리고 매니페스트 AndroidManifest.xml 부분에 아래 퍼미션

 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

 <uses-permission android:name="com.google.android.providers.gsf.permission.WRITE_GSERVICES"/>

이것도 꼭있는지 체크도 필요합니다~!

 

 

//---------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------

// ver check 

public class CSetting extends Activity

{

 

public void onCreate(Bundle savedInstanceState) 

{

...

             ...

    CVerChkAsyncTask verChk = new CVerChkAsyncTask();

           verChk.execute();

}

 

//기타코드등등

...

...

 

      //AsyncTask 을이용하여 작업해 주어야 합니다.

public class CVerChkAsyncTask extends AsyncTask<Object, Void, Float> 

{

        @Override

        protected Float doInBackground(Object... params)

        { 

         getMarketVersionName(COroBaduk.this);

 

         if (this.isCancelled())   

         {

         return null;

         }

         return null;

        }

    }

}

 

//---------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------

// MarketSession use api

 

private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices");

private static final String ID_KEY = "android_id";

 

private static String _query  = "";

 

private static String MARKET_GOOGLE_ID    = "마켓구글계정";

private static String MARKET_GOOGLE_PASS  = "마켓구글계정pass";

 

private static String getAndroidId(Context context) 

{

    //Log.i(TAG, "here in getAndroidId");

String[] params = { ID_KEY };

    Cursor c = context.getContentResolver()

            .query(URI, null, null, params, null);

  

    if (!c.moveToFirst() || c.getColumnCount() < 2)

        return null;

    

    try 

    {

       // Log.i(TAG, "getAndroidId() : " + Long.toHexString(Long.parseLong(c.getString(1))));

        return Long.toHexString(Long.parseLong(c.getString(1)));

    } 

    catch (NumberFormatException e) 

    {

        return null;

    }

}

 

public static void getMarketVersionName(Context context) 

{

//Log.i(TAG, "here in getMarketVersionName");

 

     try 

     {

     //Log.e("getMarketVersionName", "start1");

    

     String login    = MARKET_GOOGLE_ID;

     String password = MARKET_GOOGLE_PASS;

    

     MarketSession session = new MarketSession();

  

     session.login(login, password);

     session.getContext().setAndroidId(getAndroidId(context));

   

              _query = "패키지명"; //packageName       

         AppsRequest appsRequest = AppsRequest.newBuilder()

.setQuery(_query)

.setStartIndex(0).setEntriesCount(10)

.setOrderType(AppsRequest.OrderType.NEWEST)

.setWithExtendedInfo(true)

.build();

    

          session.append(appsRequest, 

         new Callback<AppsResponse>() 

         {

         @Override          

         public void onResult(ResponseContext context, AppsResponse response)

         {

         // Your code here

         // response.getApp(0).getCreator() ...

         // see AppsResponse class definition for more infos

         //Log.e("getMarketVersionName", "start2");

        

         if(response.getAppCount() < 1)

         {

         return;

         }

        

         Log.d("getMarketAppCount", response.getAppCount()+"");

        

         String name          = "";

         String creator       = "";

         String appid         = "";

         String PackageName   = "";

         String ver           = "";

         int vcode            = 0;

        

         for(int i=0; i<response.getAppCount(); i++)

         {

         name          = response.getApp(i).getTitle();

         creator       = response.getApp(i).getCreator();

         appid         = response.getApp(i).getId();

         PackageName   = response.getApp(i).getPackageName();

         ver           = response.getApp(i).getVersion();

         vcode         = response.getApp(i).getVersionCode();

            

         Log.d("getMarketVersionName_name",         "------------------------------------");

                   Log.d("getMarketVersionName_name",         name);

                   Log.d("getMarketVersionName_creator",      creator);

                   Log.d("getMarketVersionName_appid",        appid);

                   Log.d("getMarketVersionName_PackageName",  PackageName);

                   Log.d("getMarketVersionName_ver",          ver);

                   Log.d("getMarketVersionName_vercode",      vcode+"");

            

             //만약 올라간앱이앱이 중단되거나 못쓰게되면 쓸때없는 앱정보가 들어올수도있기 때문에 패키지 이름으로 걸러주어야 한다.

                   if(PackageName.length() == _query.length() && PackageName.indexOf(_query)!=-1)

             {

             //자신이 비교할 코드를 처리해준다.

             break;

             }

          }

         }

         }); 

 

         session.flush();

    

     catch (Exception e) 

     {  

     e.printStackTrace(); 

     }

    }

 

 

=================================

=================================

=================================

 

 

출처: http://dzlove.tistory.com/archive/201405

[android] 안드로이드 구글 플레이스 앱 정보 가져오기

안드로이드/Source 2014/05/28 12:16

 

네트워크 쓰레드 오류때문에 AsyncTask로 만들어줌

       
//AsyncTask<params,progress,result>
    private class ProcessFacebookTask extends AsyncTask<void, void,="" void="">{
      @Override
               protected Void doInBackground(Void... params) {
                       try
                    {
                        // TODO Auto-generated method stub
                         MarketSession session = new MarketSession();
                           session.login("google_id","google_pw");
                           session.getContext().setAndroidId(androidId(MainActivity.this));
                           String query = "카카오톡";
                           AppsRequest appsRequest = AppsRequest.newBuilder()
                                                           .setQuery(query)
                                                           .setStartIndex(0).setEntriesCount(10)
                                                           .setWithExtendedInfo(true)
                                                           .build();
                           session.append(appsRequest, new Callback<appsresponse>() {
                                    @Override
                                    public void onResult(ResponseContext context, AppsResponse response) {
                                     Logger.error("앱갯수 : "+response.getAppCount());
                                     for(int i = 0 ; i < response.getAppCount(); i++){
                                          Logger.error(i+"title =  "+response.getApp(i).getTitle());
                                          Logger.error(i+"  "+response.getApp(i).getCreator());
                                          Logger.error(i+"  "+response.getApp(i).getPackageName());
                                          Logger.error(i+"  "+response.getApp(i).getVersion());
                                          Logger.error(i+"  "+response.getApp(i).getVersionCode());
                                    }
                                   }
                           });
                           session.flush();
                    }
                    catch (Exception e)
                    {
                      e.printStackTrace();
                    }
                     return null;
               }
    }




//안드로이드 아이디 가져오기
    public String androidId(Context context) {
        Uri uri = Uri.parse("content://com.google.android.gsf.gservices");
        String key = "android_id";
        String[] paStrings = {key};
        Cursor c = context.getContentResolver().query(uri, null, null, paStrings, null);
        if(!c.moveToFirst() || c.getColumnCount() <2) return "";
        return Long.toHexString(c.getLong(1));
    }
</appsresponse></void,></params,progress,result>

 

메니페스트에 권한추가

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES">
</uses-permission>

'안드로이드 > Source' 카테고리의 다른 글

 

 

 

=================================

=================================

=================================

 

 

출처: http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=75819

 

 [안드로이드] Market API 요즘 안 되나요?

by 티칠 | 12.05.25 16:14 | 4,599 hit

MarketSession session = new MarketSession();

session.login(email, pw);


구글링 해보면 예제는 몇몇 나오지만,

대부분 공식홈피의 레퍼런스 따온 것에 불과하고,

실제로 코드를 쓴 예제는 많지 않네요.

 

위 코드에서 login() 실행하는 순간 아래와 같은 로그인 익셉션이 나면서 app 이 종료됩니다.

 

=========================

05-25 16:10:15.744: E/AndroidRuntime(8425): Caused by: com.gc.android.market.api.LoginException: The login request used a username or password that is not recognized.

=========================

 

위 에러에 대해 검색해 보니,

비 자바 언어에서 발생한 경우는 꽤 나오는데,

자바/안드로이드 에서 발생한 경우에 대해서는 잘 나오지가 않네요.

혹시 market API 변경되거나 미지원으로 바꼈나요?

최근 써보신 분 계신가요?

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 by nicehee 2012.05.25 17:40

제가 사용해보니 정상적으로 데이터를 가져오는데요..

session.login 에서 구글계정 메일과 패스워드를 정확하게 넣어주셔야하고

메인스레드에서 돌리면 에러가 나니

스레드나 어싱크타스크를 따로 만들어서 돌리셔야 정상적으로 가져옵니다.

 

by 티칠 2012.05.29 08:28

아... 스레드/어싱크타스크에서 돌린다는 건 몰랐네요.

한번 해보겠습니다.

감사합니다.

 

by 티칠 2012.05.29 09:57

이상하네요.

Thread, Runnable, AsyncTask ... 뭘 써도 동일 에러가 나네요.

 

혹시 코드가 문제 일까요?

@Override

protected Integer doInBackground(String... params) {

if (params == null || params.length < 2)

return null;

 

try {

MarketSession ms = new MarketSession();

ms.login(params[0], params[1]);

 

String query = ".....";

AppsRequest appsRequest = AppsRequest.newBuilder()

.setQuery(query)

.setStartIndex(0)

.setEntriesCount(10)

.setOrderType(AppsRequest.OrderType.NEWEST)

.setWithExtendedInfo(true).build();

 

ms.append(appsRequest, new Callback<AppsResponse>() {

@Override

public void onResult(ResponseContext ctx, AppsResponse response) {

...

}

  }); 

}

catch (Exception e) {

Log.i("MarketSession""e = " + e.getMessage());

}

 

return null;

}

 

by 티칠 2012.05.29 13:31

자문자답입니다.

password 가 틀렸었네요 ㅠㅠ

완전 며칠간 삽질했었군요 ㅠ.ㅠ

pw 가 틀렸으면 틀렸다고 나오지, 왜 에러 메시지가 저 모양인지 ;;

 

아, 그리고 스레드나 태스크 필요 없이, 

activity 에서 바로 실행해도 됩니다.

참고하세요.

 

by nicehee 2012.05.29 13:53

ICS에서는 스레드로 돌려야 되다는..

 

by 티칠 2012.05.29 14:58

아, ICS 는 생각을 못 했네요.

하지만 갤럭시 노트 ICS 에서 login 잘 됩니다.

현재는 다른 문제가 있지요.

 

==============================

AppsRequest appsRequest = AppsRequest.newBuilder()

.setQuery(query)

.setStartIndex(0)

.setEntriesCount(10)

.setOrderType(AppsRequest.OrderType.NEWEST)

.setWithExtendedInfo(true).build();

 

위와 같이 할 경우 callBack 의 response 가 '0' 입니다.

 

String query = "pname=";

query += m_ctx.getPackageName();

=> 이렇게 해도 결과는 '0'

 

query = "FMB" 

=> 이렇게 해도 결과는 '0'

 

https://play.google.com/store/search?q=fmb&c=apps

=> 분명 검색이 잘 되며 결과도 많이 나옵니다.

 

https://play.google.com/store/apps/details?id=com.mesplus.fmbtouch2

=> 실제 얻고자 하는 녀석은 이 녀석이구요.

 

인터넷에 떠도는 예제 검색어들은 다 잘 듣는데,

저만 이럴까요?

=========================

추천 0 반대 0

by nicehee 2012.05.29 18:37

갤노트 ICS 로그인은 되는데 스레드로 안하면 에러가 나거나 값을 못가져왔다는...

추천 0 반대 0

by 티칠 2012.06.05 16:37

아직 보고 계실지 모르겠네요. ^^;

말씀하신 대로 어싱크 태스크 만들어서 돌려봤는데도 아무 차이가 없네요.

검색어를 바꾸면, 예를들어,

'india' 같은 걸로 하면 결과가 잘 나옵니다.

심지어 어싱크 태스크도 아닌 activity 에서 실행해도 잘 가져옵니다. ㅠ.ㅠ

 

이 검색어에 안 걸리는 이유가 무엇인지 알 수 없을까요?

이 검색어는 뭘 검색하는 녀석인가요?

추천 0 반대 0

by nicehee 2012.06.05 17:19

https://play.google.com/store/search?q=fmb&c=apps

차라리 위의주소를 html로 파싱해서 사용하세요.

마켓 API는 10개만 가져오는것 같더군요..

html파싱이 훨 나은 정보를 얻을 수 있을겁니다.

추천 0 반대 0

by 안사지킴이 2012.06.05 17:19

축하드립니다. ;)
nicehee님은 럭키라이팅에 당첨되어 2 포인트 지급되었습니다.

추천 0 반대 0

by 티칠 2012.06.13 19:44

조언주신 덕분에 잘 해결했습니다.

이 글 보실지 모르겠습니다만, 감사합니다.

앞으로 또 조언 부탁드릴께요. ^^

 

 

=================================

=================================

=================================

 

 

출처: http://diyall.tistory.com/846

[안드로이드] 안드로이드 APK 버전 체크하

안드로이드의 APK 버전을 체크해서 요즘은 업데이트 여부를 알려주고 있습니다.

그래서 저도 시도해 볼려고 하니.. 여러가지 어렵더군요.

 

우선! 설치되어 있는 APK 의 버전은 쉽게 얻을 수 있습니다.

public static String getVersionName(Context context) {
    Log.i(TAG, "here in getVersionName");
    try {
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        return packageInfo.versionName;
    } catch (NameNotFoundException e) {
        Log.i(TAG, "err NameNotFoundException -> " + e.toString());
        return null;
    }
}

 

하지만 문제는 마켓에 올린 최신버전과 비교를 하는 문제였습니다.

 

방법은

1. 서버를 운영하여 서버에 최신버전 내용을 넣고 비교하는 방법

2. 마켓의 내용을 HTML 파싱하는 방법 등이 있는 것 같습니다.

하지만.. 아직 초보를 그것도 쉽지 않더군요.

그러다가 찾은 방법이 구글에서 제공하는 Google Market API 를 이용하는 방법입니다.

하지만 query 부분에 패키지명을 넣으면 해결될 줄 알았는데.. 계속 null 값을 반환합니다.

임의적으로 "maps" 등의 단어를 넣으면 데이타를 가져올 수는 있는데.. 뿌려주는 결과값이 왜 그렇게 나오는지를 알수가 없었습니다.

마켓에서 "maps" 로 검색한 것과는 다른 결과를 보여주기 때문입니다.

그러다가.. 문제를 해결 하였습니다.

저와 같은 고민을 하는 사람들이 많은 것 같아서.. 포스트 남깁니다.

 

AndroidId 값 가져오는 방법

private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices");
private static final String ID_KEY = "android_id";
  
static String getAndroidId(Context context) {
    Log.i(TAG, "here in getAndroidId");
    String[] params = { ID_KEY };
    Cursor c = context.getContentResolver()
            .query(URI, null, null, params, null);
  
    if (!c.moveToFirst() || c.getColumnCount() < 2)
        return null;
  
    try {
        Log.i(TAG, "getAndroidId() : " + Long.toHexString(Long.parseLong(c.getString(1))));
        return Long.toHexString(Long.parseLong(c.getString(1)));
    } catch (NumberFormatException e) {
        return null;
    }
}

 

AndroidManifest.xml 안에 권한을 넣어줘야 함

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"></uses-permission>

 

마켓의 정보 가져오기

public static String getMarketVersionName(Context context) {
    Log.i(TAG, "here in getMarketVersionName");
     
    try {
        MarketSession session = new MarketSession();
        session.login(email, pass);
        //Log.i(TAG, "session : "+session.getAuthSubToken());
        session.getContext().setAndroidId(getAndroidId(context));
        String query = "패키지명";
         
        AppsRequest appsRequest = AppsRequest.newBuilder()
                .setQuery(query)
                .setStartIndex(0).setEntriesCount(1)
                .setOrderType(AppsRequest.OrderType.NEWEST)
                .setWithExtendedInfo(false)
                .build();
         
        session.append(appsRequest, new Callback<appsresponse>() {


            @Override
            public void onResult(ResponseContext context, AppsResponse response) {
                //Log.i(TAG, "getAppCount() : " + response.getAppCount());
                for (int i=0; i<response.getappcount(); -="" getmarketversionname="" ?err="" log.i(tag,="" {="" e)="" (exception="" catch="" }="" session.flush();="" });="" marketversion="response.getApp(i).getVersion();" response.tostring());="" +="" ?="" :="" ?context.tostring()="" response.getapp(i).getversion());="" ?getversion()="" response.getapp(i).getversioncode());="" ?getversioncode()="" response.getapp(i).gettitle());="" ?gettitle()="" i++)=""> " + e.toString());
    }
     
    return marketVersion;
}</response.getappcount();></appsresponse>

 

 

=================================

=================================

=================================

 

 

import com.gc.android.market.api.MarketSession;
import com.gc.android.market.api.MarketSession.Callback;
import com.gc.android.market.api.model.Market.AppsRequest;
import com.gc.android.market.api.model.Market.AppsResponse;
import com.gc.android.market.api.model.Market.ResponseContext;

 

위 마켓 api를 사용하기 위해 필요한 파일

파일에 최신버전은

http://code.google.com/p/android-market-api/

이쪽에서 왼쪽측 download 를 보면 받을수 있다.

androidmarketapi-0.6.jar
0.18MB

 

protobuf-java-2.2.0.jar
0.31MB

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=75819

 

 

=================================

=================================

=================================

 

 

 

출처: http://www.masterqna.com/android/24950/%EB%A7%88%EC%BC%93-%EB%B2%84%EC%A0%84%EC%B2%B4%ED%81%AC-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%B4%EC%84%9C

마켓 버전체크 관련 질문드립니다. 에러가 발생해서

 

0추천

구글링해서 아래와 같은 소스코드를 찾았는데요

 

?

static String getAndroidId(Context context) {
    Log.i("fureun", "here in getAndroidId");
    String[] params = { ID_KEY };
    Cursor c = context.getContentResolver()
            .query(URI, null, null, params, null);
  
    if (!c.moveToFirst() || c.getColumnCount() < 2)
        return null;
  
    try {
        Log.i("fureun", "getAndroidId() : " + Long.toHexString(Long.parseLong(c.getString(1))));
        return Long.toHexString(Long.parseLong(c.getString(1)));
    } catch (NumberFormatException e) {
        return null;
    }
}


public void mMarketVersionCheck() {
    MarketSession session = new MarketSession();
    session.login("@gmail.com","password");
    session.getContext().setAndroidId(getAndroidId(mContext));
    String query = "package";
    AppsRequest appsRequest = AppsRequest.newBuilder()
                                    .setQuery(query)
                                    .setStartIndex(0).setEntriesCount(10)
                                    .setWithExtendedInfo(true)
                                    .build();
    session.append(appsRequest, new Callback<AppsResponse>() {
             @Override
             public void onResult(ResponseContext context, AppsResponse response) {
                      // Your code here
                      // response.getApp(0).getCreator() ...
                  
                      // see AppsResponse class definition for more infos
              Log.d("fureun", "앱갯수 : "+response.getAppCount());
               
              for(int i = 0 ; i < response.getAppCount(); i++){
                  Log.d("fureun",i+"  "+response.getApp(i).getTitle());
                  Log.d("fureun",i+"  "+response.getApp(i).getCreator());
                  Log.d("fureun",i+"  "+response.getApp(i).getPackageName());
                  Log.d("fureun",i+"  "+response.getApp(i).getVersion());
                  Log.d("fureun",i+"  "+response.getApp(i).getVersionCode());
              }
            }
    });
    session.flush();
}

 

이렇게하니까 getAndroidIId에서 계속 걸리네요 .. 에러 로그를 봐도 짐작이 안가서 도움을 구합니다

 

퍼미션에 기본적인것들 외에 추가로 마켓버전체크를 위해

 

android.permission.READ_GSERVICE 추가한 상태이며

로그캣 보고 WRITE_GSERVICE 를 추가하였지만 매니페스트에서 x표시가 떠서(이제 미지원하는 권한인듯합니다)

제외시켜놓은 상태입니다.

 

도움 부탁드리겠습니다 ..

-----------------------------------------------------------------

 

 

채택된 답변

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.WRITE_GSERVICES"/>

이렇게 추가하셨나요?

초보개발자ㅠ (33,820 포인트) 님이 2014년 5월 15일 답변 
음무님이 2014년 5월 15일 채택됨

  

네 추가했습니다.. 혹시 getAndroidId 에서 
private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices");
    private static final String ID_KEY = "android_id";
위에 이부분이 있거든요 ..
ID_KEY 여기에 들어가야하는 값이 "android_id" 가 아니라
특정 값이 들어가야하는건가요 ??

음무 님이 2014년 5월 15일 댓글작성

 

말씀하신것으로 퍼미션 바꾸니 에러가 안나네요 그전에는 위에 썻던 android.permission 으로 했었는데 그것때문에 에러가 난것같습니다.

그런데 지금은 앱 검색 갯수가 0개로 나오네요 ㅠㅠ 분명 마켓에 어플 등록돼있는데요 ㅠㅠ

음무 님이 2014년 5월 15일 댓글작성

 

저도 이쪽 관련해서는 해본적이 없지만 '-'
그대로 사용해도 무방할 것 같네요
아래를 참고하세요
http://diyall.tistory.com/846

초보개발자ㅠ 님이 2014년 5월 15일 댓글작성

 

 

+2추천

http://developer.android.com/reference/android/Manifest.permission.html#WRITE_GSERVICES

public static final String WRITE_GSERVICES

Added in API level 1

Allows an application to modify the Google service map.

Not for use by third-party applications.

Constant Value: "android.permission.WRITE_GSERVICES"

아직 미지원한다는 말이 없는데요..

인연 (31,750 포인트) 님이 2014년 5월 15일 답변

  

그런데 왜 적고나서 저장하면 에러가 생기고 클리어하면 에러가 사라지고. .
다시 수정이 일어나면 또 에러가나타납니다. 클리어 한 다음 실행하면 실행 되고있는건지싶기도하고 ㅠㅠ

음무 님이 2014년 5월 15일 댓글작성

 

또 추가해도 똑같은 에러가 발생합니다 ..

음무 님이 2014년 5월 15일 댓글작성

 

해당 권한을 보시면 다른 앱에서는 사용할 수 없다고 하는데요. 그 부분때문에 미리 알려주는것이 아닌가 싶습니다. 즉.. 구글 전용 권한이 아닌가싶네요;

인연 님이 2014년 5월 15일 댓글작성

혹시 "android_id" 대신 특정 인자가 들어가는건가요 ?? android ID 구할때요 ..

음무 님이 2014년 5월 15일 댓글작성

0추천

ID_KEY 여기에 들어가야하는 값이 "android_id" 가 아니라
특정 값이 들어가야하는건가요 ??


네.

한림의별 (480 포인트) 님이 2014년 5월 15일 답변

"android_id"
가 맞네요
해결했습니다. 마켓등록을하긴했는데 정식등록이 아니라 테스트등록이라 안됐네요

 

 

=================================

=================================

=================================

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=lion_kwon&logNo=40191745058

안드로이드 구글플레이 버전 등 정보 확인 api  안드로이드 
2013/06/25 11:55
http://blog.naver.com/lion_kwon/40191745058
전용뷰어 보기

http://code.google.com/p/android-market-api/ 

 

개발자 입장에서 쌔가빠지게 업데이트 게속 해줘도

 

업데이트 하나도 안하는 사용자들이 너무 많다!!

 

주위에 보면 그런 사람 잇더라..

 

그렇다고 따로 서버 둬서 체크하자니까 그냥 앱혼자노는 어플은 부담스럽다

 

구글플레이에 돈주고 개발자 등록했는데 요정도 서비스는 해줘야하는거 아닌가~~

 

 

그렇다 해준다.

 

버전체크 api를 이용해서

 

정보를 가져와서 사용하자~

 

Build.VERSION.SDK_INT 일케 가져온담에 맞춰서 하자

 

 MarketSession session = new MarketSession();
   session.login("id","pw"); // 구글 아무 계정이나 되는듯..?
//   session.getContext.setAndroidId(myAndroidId);

   String query = "com.kwon.kwonyangsanbus"; // 앱 이름 또는 패키지 명 다 쿼리 되는듯.. 근데 내꺼 안뜨냐 ?
   AppsRequest appsRequest = AppsRequest.newBuilder()
                                   .setQuery(query)
                                   .setStartIndex(0).setEntriesCount(10)
                                   .setWithExtendedInfo(true)
                                   .build();

   session.append(appsRequest, new Callback<AppsResponse>() {
            @Override
            public void onResult(ResponseContext context, AppsResponse response) {
                     // Your code here
                     // response.getApp(0).getCreator() ...
                     // see AppsResponse class definition for more infos
             Logger.error("앱갯수 : "+response.getAppCount());
             for(int i = 0 ; i < response.getAppCount(); i++){
              Logger.error(i+"  "+response.getApp(i).getTitle());
              Logger.error(i+"  "+response.getApp(i).getCreator());
              Logger.error(i+"  "+response.getApp(i).getPackageName());
              Logger.error(i+"  "+response.getApp(i).getVersion());
              Logger.error(i+"  "+response.getApp(i).getVersionCode());
             }
            }
   });
   session.flush();

[출처] 안드로이드 구글플레이 버전 등 정보 확인 api|작성자 떡건

 

 

 

=================================

=================================

=================================

 

 

출처: http://diyall.tistory.com/846

 

[안드로이드] 안드로이드 APK 버전 체크하기

 

안드로이드의 APK 버전을 체크해서 요즘은 업데이트 여부를 알려주고 있습니다.

그래서 저도 시도해 볼려고 하니.. 여러가지 어렵더군요.

 

우선! 설치되어 있는 APK 의 버전은 쉽게 얻을 수 있습니다.

 

public static String getVersionName(Context context) { Log.i(TAG, "here in getVersionName"); try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return packageInfo.versionName; } catch (NameNotFoundException e) { Log.i(TAG, "err NameNotFoundException -> " + e.toString()); return null; } }

 

 

하지만 문제는 마켓에 올린 최신버전과 비교를 하는 문제였습니다.

 

방법은

1. 서버를 운영하여 서버에 최신버전 내용을 넣고 비교하는 방법

2. 마켓의 내용을 HTML 파싱하는 방법 등이 있는 것 같습니다.

하지만.. 아직 초보를 그것도 쉽지 않더군요.

 

그러다가 찾은 방법이 구글에서 제공하는 Google Market API 를 이용하는 방법입니다.

하지만 query 부분에 패키지명을 넣으면 해결될 줄 알았는데.. 계속 null 값을 반환합니다.

 

임의적으로 "maps" 등의 단어를 넣으면 데이타를 가져올 수는 있는데.. 뿌려주는 결과값이 왜 그렇게 나오는지를 알수가 없었습니다.

 

마켓에서 "maps" 로 검색한 것과는 다른 결과를 보여주기 때문입니다.

 

그러다가.. 문제를 해결 하였습니다.

 

저와 같은 고민을 하는 사람들이 많은 것 같아서.. 포스트 남깁니다.

 

AndroidId 값 가져오는 방법

 

private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); private static final String ID_KEY = "android_id"; static String getAndroidId(Context context) { Log.i(TAG, "here in getAndroidId"); String[] params = { ID_KEY }; Cursor c = context.getContentResolver() .query(URI, null, null, params, null); if (!c.moveToFirst() || c.getColumnCount() < 2) return null; try { Log.i(TAG, "getAndroidId() : " + Long.toHexString(Long.parseLong(c.getString(1)))); return Long.toHexString(Long.parseLong(c.getString(1))); } catch (NumberFormatException e) { return null; } }

 

AndroidManifest.xml 안에 권한을 넣어줘야 함

 

 

 

마켓의 정보 가져오기

 

public static String getMarketVersionName(Context context) { Log.i(TAG, "here in getMarketVersionName"); try { MarketSession session = new MarketSession(); session.login(email, pass); //Log.i(TAG, "session : "+session.getAuthSubToken()); session.getContext().setAndroidId(getAndroidId(context)); String query = "패키지명"; AppsRequest appsRequest = AppsRequest.newBuilder() .setQuery(query) .setStartIndex(0).setEntriesCount(1) .setOrderType(AppsRequest.OrderType.NEWEST) .setWithExtendedInfo(false) .build(); session.append(appsRequest, new Callback() { @Override public void onResult(ResponseContext context, AppsResponse response) { //Log.i(TAG, "getAppCount() : " + response.getAppCount()); for (int i=0; i " + e.toString()); } return marketVersion; }

 

 

 

=================================

=================================

=================================

 

 

 

마켓에 앱을 올려놓고 강제로 업데이트 하는게 상황에 따라서 좋지 않은 경우도 있습니다. 

굳이 앱 마켓버전을 활용하는것 보다는 서버쪽에 get Rest Api를 하나 만들고(물론 관리할 수 있는것도 있어야 함.)

처음에 앱 진입시 서버쪽에 저장되어있는 버전을 호출해서  서버에 저장된 버전과 앱의 버전확인해서 하는 방법도 있습니다.

 

앱 버전 받아 오는 방법 

{

PackageInfo i = getPackageManager().getPackageInfo(

getPackageName(), 0);

version = i.versionName;

}

 

서버쪽은 제가 개발하지 않아서..

 

 

=================================

=================================

=================================

 

 

 

 

 

import com.gc.android.market.api.MarketSession;
import com.gc.android.market.api.MarketSession.Callback;
import com.gc.android.market.api.model.Market.AppsRequest;
import com.gc.android.market.api.model.Market.AppsResponse;
import com.gc.android.market.api.model.Market.ResponseContext;

 

위 마켓 api를 사용하기 위해 필요한 파일

파일에 최신버전은

http://code.google.com/p/android-market-api/

이쪽에서 왼쪽측 download 를 보면 받을수 있다.

 

 androidmarketapi-0.6.jar

 protobuf-java-2.2.0.jar

 

 

=================================

=================================

=================================

 

 

출처: http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=75819

 

[안드로이드] Market API 요즘 안 되나요?     

by 티칠 | 12.05.25 04:14 | 1,913 hit

MarketSession session = new MarketSession();

session.login(email, pw);


구글링 해보면 예제는 몇몇 나오지만,

대부분 공식홈피의 레퍼런스 따온 것에 불과하고,

실제로 코드를 쓴 예제는 많지 않네요.

 

위 코드에서 login() 실행하는 순간 아래와 같은 로그인 익셉션이 나면서 app 이 종료됩니다.

 

=========================

05-25 16:10:15.744: E/AndroidRuntime(8425): Caused by: com.gc.android.market.api.LoginException: The login request used a username or password that is not recognized.

=========================

 

위 에러에 대해 검색해 보니,

비 자바 언어에서 발생한 경우는 꽤 나오는데,

자바/안드로이드 에서 발생한 경우에 대해서는 잘 나오지가 않네요.

혹시 market API 변경되거나 미지원으로 바꼈나요?

최근 써보신 분 계신가요?

by nicehee 2012.05.25 17:40

제가 사용해보니 정상적으로 데이터를 가져오는데요..

session.login 에서 구글계정 메일과 패스워드를 정확하게 넣어주셔야하고

메인스레드에서 돌리면 에러가 나니

스레드나 어싱크타스크를 따로 만들어서 돌리셔야 정상적으로 가져옵니다.

by 티칠 2012.05.29 08:28

아... 스레드/어싱크타스크에서 돌린다는 건 몰랐네요.

한번 해보겠습니다.

감사합니다.

by 티칠 2012.05.29 09:57

이상하네요.

Thread, Runnable, AsyncTask ... 뭘 써도 동일 에러가 나네요.

 

05-29 09:55:19.423: I/MarketSession(32151): e = The login request used a username or password that is not recognized.

 

혹시 코드가 문제 일까요?

 

@Override

protected Integer doInBackground(String... params) {

if (params == null || params.length < 2)

return null;

 

try {

MarketSession ms = new MarketSession();

ms.login(params[0], params[1]);

 

String query = ".....";

AppsRequest appsRequest = AppsRequest.newBuilder()

.setQuery(query)

.setStartIndex(0)

.setEntriesCount(10)

.setOrderType(AppsRequest.OrderType.NEWEST)

.setWithExtendedInfo(true).build();

 

ms.append(appsRequest, new Callback<AppsResponse>() {

@Override

public void onResult(ResponseContext ctx, AppsResponse response) {

...

}

  }); 

}

catch (Exception e) {

Log.i("MarketSession""e = " + e.getMessage());

}

 

return null;

}

by 티칠 2012.05.29 13:31

자문자답입니다.

password 가 틀렸었네요 ㅠㅠ

완전 며칠간 삽질했었군요 ㅠ.ㅠ

pw 가 틀렸으면 틀렸다고 나오지, 왜 에러 메시지가 저 모양인지 ;;

 

아, 그리고 스레드나 태스크 필요 없이, 

activity 에서 바로 실행해도 됩니다.

참고하세요.

by nicehee 2012.05.29 13:53

ICS에서는 스레드로 돌려야 되다는..

by 티칠 2012.05.29 14:58

아, ICS 는 생각을 못 했네요.

하지만 갤럭시 노트 ICS 에서 login 잘 됩니다.

현재는 다른 문제가 있지요.

 

==============================

AppsRequest appsRequest = AppsRequest.newBuilder()

.setQuery(query)

.setStartIndex(0)

.setEntriesCount(10)

.setOrderType(AppsRequest.OrderType.NEWEST)

.setWithExtendedInfo(true).build();

 

위와 같이 할 경우 callBack 의 response 가 '0' 입니다.

 

String query = "pname=";

query += m_ctx.getPackageName();

=> 이렇게 해도 결과는 '0'

 

query = "FMB" 

=> 이렇게 해도 결과는 '0'

 

https://play.google.com/store/search?q=fmb&c=apps

=> 분명 검색이 잘 되며 결과도 많이 나옵니다.

 

https://play.google.com/store/apps/details?id=com.mesplus.fmbtouch2

=> 실제 얻고자 하는 녀석은 이 녀석이구요.

 

인터넷에 떠도는 예제 검색어들은 다 잘 듣는데,

저만 이럴까요?

=========================

by nicehee 2012.05.29 18:37

갤노트 ICS 로그인은 되는데 스레드로 안하면 에러가 나거나 값을 못가져왔다는...

by 티칠 2012.06.05 16:37

아직 보고 계실지 모르겠네요. ^^;

말씀하신 대로 어싱크 태스크 만들어서 돌려봤는데도 아무 차이가 없네요.

검색어를 바꾸면, 예를들어,

'india' 같은 걸로 하면 결과가 잘 나옵니다.

심지어 어싱크 태스크도 아닌 activity 에서 실행해도 잘 가져옵니다. ㅠ.ㅠ

 

이 검색어에 안 걸리는 이유가 무엇인지 알 수 없을까요?

이 검색어는 뭘 검색하는 녀석인가요?

by nicehee 2012.06.05 17:19

https://play.google.com/store/search?q=fmb&c=apps

차라리 위의주소를 html로 파싱해서 사용하세요.

마켓 API는 10개만 가져오는것 같더군요..

html파싱이 훨 나은 정보를 얻을 수 있을겁니다.

by 안사지킴이 2012.06.05 17:19

축하드립니다. ;)
nicehee님은 럭키라이팅에 당첨되어 2 포인트 지급되었습니다.

by 티칠 2012.06.13 19:44

조언주신 덕분에 잘 해결했습니다.

이 글 보실지 모르겠습니다만, 감사합니다.

앞으로 또 조언 부탁드릴께요. ^^

 

 

=================================

=================================

=================================

 

 

少说,That‘s it!

Current progress

  • You can browse market with any carrier or locale you want.
  • Search for apps using keywords or package name.
  • Retrieve an app info using an app ID.
  • Retrieve comments using an app ID.
  • Get PNG screenshots and icon

Requirement

  1. *(1) A Google Account
  2. *(2) Include androidmarketapi-X.Y.jar and protobuf-java-X.Y.Z.jar in your classpath,            
    下载地址:http://code.google.com/p/android-market-api/downloads/list

要把这两个JAR导入到项目中去.由于代码比较好理解,就不添加注释了:-)

HowToSearchApps:

 You can search by using :

By package name;

  1. String query = "pname:<package>";  

 By developper name :

  1. String query = "pub:<name>"

 通过包名查看程序关键代码:

  1. String query = "pname:com.luckyxmobile.timers4me";// 通过包名查找程序  
  2. MarketSession session = new MarketSession();  
  3. session.login("your gmail account""your password");  
  4. AppsRequest appsRequest = AppsRequest.newBuilder().setQuery(query)  
  5. .setStartIndex(0).setEntriesCount(10).setWithExtendedInfo(true).build();  
  6. session.append(appsRequest, new MarketSession.Callback<AppsResponse>() {  
  7. @Override 
  8. public void onResult(ResponseContext context, AppsResponse response) {  
  9. TextView text = (TextView) findViewById(R.id.text);  
  10. String id = response.getApp(0).getId();  
  11. String creatorID = response.getApp(0).getCreatorId();  
  12. String creator = response.getApp(0).getCreator();  
  13. String packageName = response.getApp(0).getPackageName();  
  14. String price = response.getApp(0).getPrice();  
  15. String rating = response.getApp(0).getRating();  
  16. int ratingCount = response.getApp(0).getRatingsCount();  
  17. String title = response.getApp(0).getTitle();  
  18. String version = response.getApp(0).getVersion();  
  19. int versionCode = response.getApp(0).getVersionCode();  
  20. int serializedSize = response.getApp(0).getSerializedSize();  
  21. ExtendedInfo extendedInfo = response.getApp(0).getExtendedInfo();  
  22. text.setText("id:" + id + "\nCreatorId:" + creatorID  
  23. "\nCreator:" + creator + "\nPackageName:" 
  24. + packageName + "\nPrice:" + price + "\nrating:" 
  25. + rating + "\nRatingCount:" + ratingCount + "\ntitle:" 
  26. + title + "\nVersion:" + version + "\nversionCode:" 
  27. + versionCode + "\nDownloadsCount:" 
  28. + extendedInfo.getDownloadsCount()  
  29. "\nDownloadsCountText:" 
  30. + extendedInfo.getDownloadsCountText()  
  31. "\nInstallSize:" + extendedInfo.getInstallSize()  
  32. "\nSerializedSize:" + serializedSize  
  33. "\nDecription:" + extendedInfo.getDescription()  
  34. "\nContactEmail:" + extendedInfo.getContactEmail()  
  35. "\nContactPhone:" + extendedInfo.getContactPhone()  
  36. "\nContactWebsite:" 
  37. + extendedInfo.getContactWebsite());  
  38. }  
  39. });  
  40. .flush();//发送并刷新 

运行结果:

 

 

HowToGetAppComments  :

  1. CommentsRequest commentsRequest = CommentsRequest.newBuilder().setAppId("7065399193137006744") .setStartIndex(0).setEntriesCount(10)build();         
  2. session.append(commentsRequest, new Callback<CommentsResponse>() {   
  3. @Override      
  4. public void onResult(ResponseContext context, CommentsResponse response) {    
  5. System.out.println("Response : " + response);      
  6. // response.getComments(0).getAuthorName()       
  7. // response.getComments(0).getCreationTime()       
  8. // ...      
  9. } });   
  10. session.flush(); 

HowToGetAppScreenshot   :

  1. GetImageRequest imgReq = GetImageRequest.newBuilder().setAppId("-7934792861962808905").setImageUsage(AppImageUsage.SCREENSHOT).setImageId("1").build();       
  2. session.append(imgReq, new Callback<GetImageResponse>() {                                                       
  3. @Override         
  4. public void onResult(ResponseContext context, GetImageResponse response) {  
  5. try {                                                
  6. FileOutputStream fos = new FileOutputStream("icon.png");                                   
  7. fos.write(response.getImageData().toByteArray());                                        
  8. fos.close();                                  
  9. catch(Exception ex) {                           
  10. ex.printStackTrace();                                       
  11.   }        
  12. } });   
  13. session.flush();  

 

 

=================================

=================================

=================================

 

 

 

 

반응형

 

 

728x90

 

 

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=truehan207&logNo=120118331181

 

전용뷰어 보기

http://code.google.com/p/android-market-api/

 

를 방문하면

 

다음 두 jar를 득할 수 있다.

 

androidmarketapi-0.3.jar
protobuf-java-2.2.0.jar

프로젝트에 두 라이브러리를 임포트 시키고 사용하면 끝 ^^

 

다음 소스는 예제..

 

"버스"키워드로 마켓을 검색하여 첫번째 어플 관련 정보를 간략하게 나타내준다.

 

 

import com.gc.android.market.api.MarketSession;
import com.gc.android.market.api.MarketSession.Callback;
import com.gc.android.market.api.model.Market.AppsRequest;
import com.gc.android.market.api.model.Market.AppsResponse;
import com.gc.android.market.api.model.Market.ResponseContext;

 

public class TestMarket {

 
 public static void main(String[] args) {
  
  
  try {
   
   MarketSession session = new MarketSession(); 
   
   session.login("Id", "password");
   String query = "버스";
   
   AppsRequest appsRequest = AppsRequest.newBuilder()
    .setQuery(query)
    .setStartIndex(0)
    .setEntriesCount(10)
    .setOrderType(AppsRequest.OrderType.NEWEST)
    .setWithExtendedInfo(true).build();
   
   session.append(appsRequest, new Callback<AppsResponse>() {
    @Override          
    public void onResult(ResponseContext context, AppsResponse response){
     // Your code here
     // response.getApp(0).getCreator() ...
     // see AppsResponse class definition for more infos
     System.out.println(response.getApp(0).getTitle());
     System.out.println(response.getApp(0).getCreator());
     System.out.println(response.getApp(0).getRating());
     System.out.println(response.getApp(0).getRatingsCount());
     System.out.println(response.getApp(0).getPrice());
     
     System.out.println(response.getApp(0).getPriceCurrency());
     System.out.println(response.getApp(0).getPriceMicros());
     System.out.println(response.getApp(0).getSerializedSize());
     System.out.println(response.getApp(0).getVersion());
     System.out.println(response.getApp(0).getExtendedInfo().getDownloadsCountText());
    }
   }
   ); 
   
   session.flush();
  } catch (Exception e) {
   e.printStackTrace();
  }
   
 }

}

 

 

실행 결과는 다음과 같이 나온다.

 

서울버스 (SeoulBus)
YoungHoon Park
4.623952909214399
4417


0
1220
1.2.3-update5
>250,000

 

 

=================================

=================================

=================================

 

 

출처: https://code.google.com/p/android-market-api/

An open-source API for the Android Market

This is not an official api. I'm not afiliated to google in any way.

This library allow you to ask directly google's official android market servers for information, search for apps, ...

Main target is java but it can be easily adapted to other languages since it's Google ProtoBuf based.

There is a Ruby port by jberkel here and a PHP port by splitfeed here. These is also a crawler on top of this library by Raunak Gupta here.

For any help using this API please use the google group HERE, no direct help request please, i won't answer.

Requirement

No specific requirement, it use java.net.URL for communication with the google market server, that's all. So it should run without problem on Google App Engine or in an Android app. Include androidmarketapi-X.Y.jar and protobuf-java-X.Y.Z.jar in your classpath and you're good to go.

Current progress

  • You can browse market with any carrier or locale you want.
  • Search for apps using keywords or package name.
  • Retrieve an app info using an app ID.
  • Retrieve comments using an app ID.
  • Get PNG screenshots and icon

Version History

  • Version 0.6 : Fix corrupted session when exception occur. Change default android id and default sdk version
  • Version 0.5 : Fix random 400 errors, fields recentChanges and promotionalVideo added
  • Version 0.4 : Better error handling at login, default to android 2.2 (passion:8)
  • Version 0.3 : GetImage api added, now searching for android 2.0 apps

About authentication

A google account is required. You can use the login method with a valid login/password pair or provide an authsub token for service "android".

See Auth for installed apps for more info about authsub. You can also get a valid authsub token from an android device using the unofficial google clientlogin api for android (client.jar), see details here.

Basic Command-line usage

put the 2 jars in a folder and type : java -jar androidmarketapi-X.Y.jar myemail mypassword myquery

Basic Java Example

MarketSession session = new MarketSession();
session
.login(email,password);
session
.getContext.setAndroidId(myAndroidId);

String query = "maps";
AppsRequest appsRequest = AppsRequest.newBuilder()
                               
.setQuery(query)
                               
.setStartIndex(0).setEntriesCount(10)
                               
.setWithExtendedInfo(true)
                               
.build();
                       
session
.append(appsRequest, new Callback<AppsResponse>() {
         
@Override
         
public void onResult(ResponseContext context, AppsResponse response) {
                 
// Your code here
                 
// response.getApp(0).getCreator() ...
                 
// see AppsResponse class definition for more infos
         
}
});
session
.flush();

Check out how to :

How can i help ?

  • Contributions are welcome ! The project is mainly missing documentation and examples...
  • You can buy me a beer using this button 

 

=================================

=================================

=================================

 

 

출처ㅣ https://code.google.com/p/android-market-api/wiki/WithAndroid

 

WithAndroid  
Updated Jul 25, 2011 by thiel.al...@gmail.com

Authentication

To get a valid authsub token from an android device using the unofficial google clientlogin api for android (client.jar)
From http://www.toxicbakery.com/android-development/getting-google-auth-sub-tokens-in-your-android-applications/
Not tested :

Locale and Operator

Quote from Aladin Q :
I noticed it is important to fill the "setLocale" and "setOperator" methods in order to expect "correct results" from market session (understand "correct results" as "similar results if the same query is made in the official Android Market application).
Per example, in order to avoid modifications of your sources and because "Orange F" is not listed, we can pass the results of the snippet below to the method "setOperator":

Comment by toxicbak...@gmail.comJul 26, 2011

Glad to see our blog does not go to waste =)

Comment by humingch...@gmail.comDec 23, 2012

authToken from AccountManager? cannot get App info

Comment by humingch...@gmail.comDec 25, 2012

how to analyze the https package, i can not get a private key, anyone knows other method?

Comment by ocmr1878@gmail.comToday (16 hours ago)

Sale y q como anda del mendigo

 

 

=================================

=================================

=================================

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=digitalan&logNo=10094987838

▶안드로이드 어플 업데이트, 업그레이드 방법!!!

 

▶안드로이드 마켓 어플 등록시에

만약 제가  game이라는 이름의 어플을 등록했습니다.

이어플에서 새로운기능을 추가후 다시 어플을 업데이트할수있게 해주고 싶습니다

어케하는지좀 아려주세여

 

등록 시에 어플의 버전을 올려서 등록하면 마켓에서 알아서 업데이트를 지원합니다~
안드로이드 manifest 파일에 보시면 <menifest android:versionCode> 가 있습니다.
예를 들어 이걸 이번에 <menifest android:versionCode="1">로 해서 마켓에 등록했다면
다음에 업데이트 버전은 이걸 <menifest android:versionCode="2">로 해서 등록하시면 마켓에서 업데이트가 있음을 알려주고 사용자는 마켓을 통해 업데이트 할 수 있습니다.

http://www.androidpub.com/android_dev_qna/832435

 

앱배포후 서버연동하여 자동업데이트 방법 질문입니다
http://www.androidpub.com/567279

2010.07.21 11:57:44

서버에 접속후 버전체크를 하여 버전값이 틀리면 자동업데이트르 해주고자 합니다.

현재 상용중인 어플을 여럿밧는데 처음실행시 버전이 틀리면 자동업데이트를 하는것을 보았습니다.

다운로드 받아서 적용시키는거 같은데 이경우 apk파일을 다운로드 받아서 덮어쉬우는 것인지 개별 class xml파일을 다운로드받아 덮어 쉬우는 것인지 궁금합니다.

해보신분이 게시면 힌트점 주세요

 

2010.07.21 13:25:04 안드로이드굿맨(추천: 1 / 0) 
apk를 받아서 reInstall 시키는 형태입니다.
//install apk
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 

 

 

▶따로 서버를 운영해서 버전 업데이트가 있는지 앱 자체에서 주기적으로 체크하는 것을 만들고, 업데이트가 있는 경우 다운로드 받아서 인스톨 시켜주시면 됩니다. Intent를 통해서 sd카드로 다운받은 앱등을 인스톨시킬수 있으니 찾아보세요.
http://www.androidpub.com/391529

 

 

웹서버 연동하여 어플 버전 체크 후 업데이트 관련 질문입니다.

웹서버를 연동하여 어플을 실행하면 웹서버에 접속해서 단말기의 어플과
서버에 업로드된 어플의 버전을 비교해서 자동업데이트를 할려고 하는데요..
일단 서버에서 어플을 받아서 설치하는것은 해결하였습니다.

그런데..
제 단말기에 설치된 어플의 버전정보를 꺼내오는것은 했는데.. 서버에 올려진 apk파일의 
버전을 어떤식으로 가지고 와서 비교해야 하는지 감이 잘 안오네요..

지금은 

어플실행 -> localhost/down.do -> apk 다운 -> 설치      이런식으로 작동하는데..

 

어플실행 -> localhost/appInfo.do -> 저장해둔 어플 정보 파싱 후 단말기의 어플과 비교 -> apk 다운 -> 설치
   
이런식으로 해야하나요?

 

잘 몰라서 이렇게 작업하고 있는데..왠지 다른 방법이 있을거 같아서요..

알고 계신분들 알려주세요..

버전을 비교하실땐 미리 새로운 APK의 파일에대한 버전정보를 님이 가지고 계셔야합니다;; 그건 얻는게 아님;;
설치된 어플에서 버전을 긁고, 새로운 APK파일의 버전보다 아래면 업뎃을 진행해야죠...

 

2010.08.24 16:09:16 isul
apk 파일 압축 해제한 후 AndroidManifest.xml(바이너리 파일)에서 정보를 구하면 됩니다.
또는 sdk가 설치되어 있다면
aapt d badging xxx.apk
명령을 exec() 함수 등으로 실행해서 구해도 됩니다.
http://www.androidpub.com/?_filter=search&mid=android_dev_qna&search_target=title&search_keyword=%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8&document_srl=705835

[출처] ▶안드로/이드 어플 업데이트, 업그레이드 방법!!!|작성자 새벽공원

 

 

 

=================================

=================================

=================================

 

 

출처: http://www.androidpub.com/android_dev_qna/832435

안드로이드 마켓 어플 등록 질문입니다.

편본좌

http://www.androidpub.com/832435

2010.10.01 13:36:11

3291

5

앱개발 질문

안드로이드 마켓 어플 등록시에 

만약 제가  game이라는 이름의 어플을 등록했습니다.

이어플에서 새로운기능을 추가후 다시 어플을 업데이트할수있게 해주고 싶습니다

어케하는지좀 아려주세여

 

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=832435&act=trackback&key=f1c

2010.10.01 13:40:15

소박한힘

등록 시에 어플의 버전을 올려서 등록하면 마켓에서 알아서 업데이트를 지원합니다~

2010.10.01 13:43:59

편본좌

버전을 올려서 등록한다는게 무슨뜻인지

2010.10.01 13:59:29

소박한힘

안드로이드 manifest 파일에 보시면 <menifest android:versionCode> 가 있습니다.

예를 들어 이걸 이번에 <menifest android:versionCode="1">로 해서 마켓에 등록했다면

다음에 업데이트 버전은 이걸 <menifest android:versionCode="2">로 해서 등록하시면 마켓에서 업데이트가 있음을 알려주고

사용자는 마켓을 통해 업데이트 할 수 있습니다.

 

이렇게 마켓을 이용하지 않고 다른 형태로 하길 원하시는 거 였다면 그것까지는 모르겠습니다 ^^;

2010.10.01 14:07:35

편본좌

아정말 좋은 답변입니다. 이해가 단번에 되었습니다. 근데님 버전업 한것을 스샷으로 올린화면 같은거는 볼수있는데가 없을까여

2010.10.01 15:03:02

소박한힘

헉 어떤 걸 말씀하시는지 제가 파악을 못해서 ^^;;

 

암튼 업데이트 어찌해야 하나는 너무 걱정하지 않으셔도 됩니다~

 

나중에 등록하실 때 해보면 알게 되요~

 

 

=================================

=================================

=================================

 

 

출처: http://www.androidpub.com/567279

앱배포후 서버연동하여 자동업데이트 방법 질문입니다.

까이꺼

http://www.androidpub.com/567279

2010.07.21 11:57:44

4168

3

앱개발 질문

서버에 접속후 버전체크를 하여 버전값이 틀리면 자동업데이트르 해주고자 합니다.

현재 상용중인 어플을 여럿밧는데 처음실행시 버전이 틀리면 자동업데이트를 하는것을 보았습니다.

다운로드 받아서 적용시키는거 같은데 이경우 apk파일을 다운로드 받아서 덮어쉬우는 것인지 개별 class xml파일을 다운로드받아 덮어 쉬우는 것인지 궁금합니다.

해보신분이 게시면 힌트점 주세요

 

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=567279&act=trackback&key=2dc

2010.07.21 13:25:04

안드로이드굿맨

(추천: 1 / 0)

apk를 받아서 reInstall 시키는 형태입니다.

//install apk UriinstallUri=Uri.fromParts("package","xxx",null); returnIt=newIntent(Intent.ACTION_PACKAGE_ADDED,installUri);

2010.07.30 16:45:54

까이꺼

답변감사합니다. 휴가 다녀와서 이제야 답변을 다네요

휴가는 갓다오셧는지요 좋은정보 감사합니다

2010.07.30 17:13:01

까이꺼

reInstall 을 시키는데 현재 프로그램 실행시 재설치 가능한건가요

아니면 다른 앱에서 재설치 후 프로그램을 실행시켜야 하는것인가요

returnIt를 startActivty로 실행시키는것 아닌가요

 

 

=================================

=================================

=================================

 

 

출처: http://androi.tistory.com/9

안드로이드 앱이 업그레이드가 되었는데도, 사용자들은 잘 확인하지도 않고, 설사 확인했다고 해도 큰 문제가 없으면 업데이트를 잘하지 않는다.

큰 노력과 수고없이, 앱 시작시 최신버젼을 확인하고  최신버젼이 있을 경우, 사용자에게 팝업을 띄우고, 업데이트 하는 방법을 알아보자.

1. 웹페이지에 최신 버젼을 표시
    간단하게 무료로 사용하고 싶으면 구글앱엔진을 추천한다. 그 외에 본인의 블로그 등을 사용해도 좋음
    ex)  http://checkappver.appspot.com/CheckBBVersion.html 

<html>

<body>

version:

1.11

</body>

</html>



2. 웹페이지의 html 파일을 가져와서 간단한 파싱으로 버젼 구하기

DownThread mThread;
String sVersion;  // 웹페이지에서 가져온 버젼이 저장됨

        // 웹서버에서 369 숫자야구 버젼 가져오기

mThread = new DownThread("http://checkappver.appspot.com/CheckBBVersion.html");

mThread.start();


         ...

 

class DownThread extends Thread {

String mAddr;

String mResult;

 

DownThread(String addr) {

mAddr = addr;

mResult = "";

}

 

public void run() {

StringBuilder html = new StringBuilder(); 

try {

URL url = new URL(mAddr);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

if (conn != null) {

conn.setConnectTimeout(10000);

conn.setUseCaches(false);

if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {

BufferedReader br = new BufferedReader(

new InputStreamReader(conn.getInputStream()));

Boolean bVersion = false;

for (;;) {

String line = br.readLine();

if(bVersion){

mResult = line;

break;

}

if(line.equals("version:")){

bVersion = true;

}

if (line == null) break;

}

br.close();

}

conn.disconnect();

}

catch (Exception ex) {;}

mAfterDown.sendEmptyMessage(0);

}

}

 

Handler mAfterDown = new Handler() {

public void handleMessage(Message msg) {

// Toast.makeText(mContext, mThread.mResult, Toast.LENGTH_SHORT).show();

sVersion = mThread.mResult;

}

};


3. 현재 앱의 버젼 구하기

         나같은 경우는 리소스에 버젼을 넣고 불러서 확인 

               String sMyVersion = getResources().getString(R.string.check_version);

 


4. 현재 앱의 버젼과 웹페이지에서 가져온 버젼을 비교하기

           if(!sServerVersion.equals(sMyVersion)){ // 만약 서버와 버젼이 같지 않으면 업데이트 요청

           float fMyVersion = Float.parseFloat(sMyVersion);

           float fServerVersion = Float.parseFloat(sServerVersion);  // 서버 버젼이 클때만 업데이트 요청

           if(fServerVersion > fMyVersion){

           showDialog(9);

           }

           }


5. 최신 버젼이 있으면 팝업을 띄우고,  확인을 선택하면 해당 마켓으로 가기 
        ...
         case 9: // 업데이트 요청

            return new AlertDialog.Builder(mContext)

            .setTitle(R.string.str_updateinfo)

            .setMessage(R.string.str_updaterequestmsg)

            .setCancelable(true)

            .setPositiveButton(R.string.str_ok, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {

                 bCheckVersionDialog = true;

                 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=dingdong.game.bb"));

             startActivity(intent);

                }

            })

            .setNegativeButton(R.string.str_cancel, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {

                 bCheckVersionDialog = true;

                    /* User clicked cancel so do some stuff */

                }

            })

            .create();  

 

 

=================================

=================================

=================================

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=smini25&logNo=169238177

 

어플 자기 자신의 버젼을 체크하는 기능이다.

마켓 버젼과 버젼을 확인 후 업데이트를 할 수 있도록 하게 하는게 좋겠다.

 

 /** 

     * Gets the software version retrieved from the Manifest. 
     */ 
    private String getSoftwareVersion() { 
        try { 
                PackageInfo packageInfo = getPackageManager 
().getPackageInfo(<wbr style="color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: rgb(255, 255, 255); " />getPackageName(), 0); 
                return packageInfo.versionName; 
        } catch (PackageManager.<wbr style="color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: rgb(255, 255, 255); " />NameNotFoundException e) { 
                Log.e(TAG, "Package name not found", e); 
        }; 

 

마켓에 등록된 앱의 버젼 체크

 

http://code.google.com/p/android-market-api/ 

 

An open-source API for the Android Market

This is not an official api. I'm not afiliated to google in any way.

This library allow you to ask directly google's official android market servers for information, search for apps, ...

Main target is java but it can be easily adapted to other languages since it's Google ProtoBuf based.

There is a Ruby port by jberkel here and a PHP port by splitfeed here. These is also a crawler on top of this library by Raunak Guptahere.

For any help using this API please use the google group HERE, no direct help request please, i won't answer.

Requirement

No specific requirement, it use java.net.URL for communication with the google market server, that's all. So it should run without problem on Google App Engine or in an Android app. Include androidmarketapi-X.Y.jar and protobuf-java-X.Y.Z.jar in your classpath and you're good to go.

Current progress

  • You can browse market with any carrier or locale you want.
  • Search for apps using keywords or package name.
  • Retrieve an app info using an app ID.
  • Retrieve comments using an app ID.
  • Get PNG screenshots and icon

Version History

  • Version 0.6 : Fix corrupted session when exception occur. Change default android id and default sdk version
  • Version 0.5 : Fix random 400 errors, fields recentChanges and promotionalVideo added
  • Version 0.4 : Better error handling at login, default to android 2.2 (passion:8)
  • Version 0.3 : GetImage api added, now searching for android 2.0 apps

About authentication

A google account is required. You can use the login method with a valid login/password pair or provide an authsub token for service "android".

See Auth for installed apps for more info about authsub. You can also get a valid authsub token from an android device using the unofficial google clientlogin api for android (client.jar), see details here.

Basic Command-line usage

put the 2 jars in a folder and type : java -jar androidmarketapi-X.Y.jar myemail mypassword myquery

Basic Java Example

MarketSession session = new MarketSession();
session
.login(email,password);
session
.getContext.setAndroidId(myAndroidId);

String query = "maps";
AppsRequest appsRequest = AppsRequest.newBuilder()
                               
.setQuery(query)
                               
.setStartIndex(0).setEntriesCount(10)
                               
.setWithExtendedInfo(true)
                               
.build();
                       
session
.append(appsRequest, new Callback<AppsResponse>() {
         
@Override
         
public void onResult(ResponseContext context, AppsResponse response) {
                 
// Your code here
                 
// response.getApp(0).getCreator() ...
                 
// see AppsResponse class definition for more infos
         
}
});
session
.flush();

Check out how to :

[출처] [Android] android-market-api 사용하기 (안드로이드 마켓 API)|작성자 꾸러기

 

 

 

=================================

=================================

=================================

 

 

출처: http://www.androidpub.com/391529

혹시.. 개인적으로 배포한 안드로이드어플 업데이트는 어덯게 해야되는지??

arlenness

http://www.androidpub.com/391529

2010.05.28 16:26:59

4848

 

개인적으로 배포한 안드로이드 어플을 추후에 업데이트 하게 될 경우엔

업데이트한 어플을 따로 배포를 해줘야되는건가요?

마켓을 통하지 않고 배포 했을경우에 업데이트 하는 방법을 좀 알려주셨으면 합니다.

 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=391529&act=trackback&key=1e7

 

2010.05.28 18:16:38

회색

따로 서버를 운영해서 버전 업데이트가 있는지 앱 자체에서 주기적으로 체크하는 것을 만들고, 업데이트가 있는 경우 다운로드 받아서 인스톨 시켜주시면 됩니다. Intent를 통해서 sd카드로 다운받은 앱등을 인스톨시킬수 있으니 찾아보세요.

2010.05.28 19:16:13

arlenness

아! 그렇군요;; 감사합니다 ^^; 

 

 

=================================

=================================

=================================

 

 

출처: http://www.kandroid.org/board/board.php?board=androidmarket&command=body&no=31

 

안드로이드 마켓 버전업  및 보안 구조 강화 - Update Date(2010/11/28)
 
Froyo에서 안드로이드 마켓 클라이언트가 최근 버전업이 되었습니다.
(다른 버전의 안드로이드 플랫폼 버전에서의 상황은 직접 check해 보지는 못했습니다.
 사용하시고 계신 분들이 덧글 남겨주시면 본문에 반영하도록 하겠습니다.)

- VersionName : 2.12, 
- VersionCode : 3002012 
- 주요변경사항 : 
   1) 유효한 Android Device ID를 가진 market client에서만 접근을 허용
   2) APK에 대한 INSTALL, UNINSTALL Push Message 보안구조 강화
   3) market client와 server간의 protocol 코드보안 강화
- 의미 :
   기존에 많이 사용되었던 MyMarket, AppBrain과 같은 클라이언트들의 불법적(?) 기능 차단.
   Push Message기반의 Server Side App INSTALL, UNINSTALL 보안구조 강화.
 
웹기반 Android Market Client [데모 및 소스] - Create Data(2010/8/18)
 
데모 : http://www.kandroid.org/market/allAppItem.psp 
 
데모에 사용된 소스코드 및 설치방법 요약 :
 
1. http://code.google.com/p/protobuf/ 를 다운로드 후, 설치한다.
 
2.  market.proto(4.9KB) : 를 다운로드 한다.
 
3. shell prompt에서 다음과 같이 실행한다.
    > protoc --python_out=. market.proto 
    결과 : market_pb2.py
 
4. 3의 결과로 만들어진 market_pb2.py API를 사용한 안드로이드 마켓 클라이언트 라이브러리를 작성한다.
    kandroid_market.py(9.6KB) 
   - 위의 파일을 다운로드후, loginform_fields의 Email 값과 Password 값을 지정한다.
   - 추가적으로 def downloadRequest내의 userId와 androidId의 값도 지정한다.
     (이 값을 지정하기 위해서는, 안드로이드 폰내의 DownloadProvider의 database table내에 
      임시로 생성되는 정보를 분석하면 됨)
 
   - 주의사항 : 위의 코드에서 아래의 부분 patch 하세요.
     base64.b64encode => base64.urlsafe_b64encode (update : 2011.10.26)
 
5. 간단하게 UI를 만든다. (현재 kandroid는 psp를 사용하였음)
   (아래의 파일들 다운로드시, 마우스 우측버튼 누른후 save as 하심이 좋을 듯합니다.)
    header.psp(10.4KB) (kandroid header psp 파일)
    footer.psp(165byte) (kandroid footer psp 파일)
    featuredAppItem.psp(1.7KB) (안드로이드 마켓 클라이언트 초기화면)
    allAppItem.psp(4.6KB) (모든 애플리케이션 화면)
    allGameItem.psp(4.6KB) (모든 게임 화면) 
    categoryItem.psp(5KB) (카테고리별 아이템 목록 화면)
    asset.psp(4.3KB) (애플리케이션 화면)
    download.psp(610byte) (애플리케이션 다운로드 기능 : 무료 애플리케이션에 한정됨)
    query.psp(4.1KB) (검색결과 화면)
    screenshot.psp(855byte) (스크린 샷 이미지 로드 기능)
    icon.psp(723byte) (아이콘 이미지 로드 기능)
    category.psp(1.3KB) (카테고리 정보를 읽어오는 기능)
 
6. py. psp 실행 및 apk mimetype 지정을 위한 apache 설정

LoadModule python_module modules/mod_python.so
 
Alias /market "/home/kandroid/market"
<Directory /home/kandroid/market>
    AddHandler mod_python .psp .py
    PythonHandler mod_python.psp | .psp
    PythonHandler mod_python.publisher | .py
</Directory>
 
AddType application/vnd.android.package-archive .apk
 
----------------
 
기타 : 현재 안드로이드 마켓상의 게임 애플리케이션에 대해 한국내에서의 접근을 차단하고 있는 이유로,
         Market Filter의 기본항목인 Operator를 T-Mobile USA(310260)으로 설정하였으나,
         market.proto내에 국내 다른 이통사에 대한 설정정보가 있으니...적절히 변경해서 사용할 수 있습니다.
    
 이광우
2010-08-18 20:02
공개 하셨군요. 저도 오늘 parsing script 노가다 좀 했는데 .. 삽으로 꽤 많이 파셨을 듯하네요.  좋은 정보 감사합니다. :)
    
 다이나믹링크
2010-08-18 21:01
정말 멋집니다. 소스 공개 감사합니다.
데모링크에서는 2.2 Froyo 앱은 보이질 않는군요. 개선해 주시면 좋겠습니다.
    
 onjo
2010-08-18 21:17
ㄷㄷ 대단한 자료입니다. 힘들게 구현하시고 공개해주셔서 대단히 감사드립니다.
    
 들풀
2010-08-20 18:20
Market(Beta) 데모 링크가 정상작동하고 있지 않습니다.
(Android Market에서 불법적인 접근으로 여기고 자동 차단된 듯 합니다...)
주의가 요(要)됩니다.
    
 두근두근
2010-08-31 14:34
와우!! 이런 핵까지 하시다니. 정말 열정과 끈기가 대단하시다라고 밖에는 할말이 없네요@.@
    
 도돌
2010-09-04 19:03
구글 아이디가 막혀 버렸는데 어떻하죠? ^^;;;
CHAPCHA 이미지로 푸는 주소를 알아서 직접 글자를 입력 해 보아도 안되네요....
클라이언트가 달라서 그런가.... ㅠㅠ
아이디 몇개 정도 돌려서 쓰세요? 케쉬 한다고 해도.... 리밋이 어느정도인지.. ^^;;;; 도움을!
    
 roadmaker
2010-09-07 18:56
도움 요청합니다. ㅜㅜ
들풀님이 올리신 소스와 다른 소스를 참고하여 java로 app download client를 만들었는데,
계속 403 오류가 납니다. 뭐가 문제인지 파악이 안됩니다.
참고자료를 찾아보면 userId가 문제일경우에 403오류가 난다고 하는데.
userId가 폰번호 아닌가요? 
아니면 어떻게 해야 userId를 얻을 수 있나요?
    
 에스타임
2010-10-22 16:20
DownloadProvider에서 사용하는 데이터베이스 이건 어떻게 볼수 있나요?
    
 왁구
2010-11-22 18:04
안녕하세요. 
저는 어플 상세정보의 덧글의 총 개수를 가져오고 싶은데.. 혹시 작업을 해보셨다면.. 가능한지 알고 싶습니다.
    
 들풀
2010-11-28 04:35
안드로이드 마켓에 대한 보안구조가 강화되었습니다 - 본문 참조.
    
 munhoney
2010-12-08 10:41
안녕하세요 무료 애플리케이션에 대해서 다운로드 가능하다고 했는데, 데모에는 포함 안된건가요?

다운로드 방법에 대해서 알고 싶은데 어떻게 해야하는지 알고 싶습니다.
    
 빌리안
2011-01-03 18:20
안녕하세요. 좋은 정보 감사드립니다. 근데 deviceId는 무엇을 가지고 만드는지 궁금합니다. 에뮬레이터에 마켓 설치했는데 한국 app 들이 검색이 안됩니다. 무엇을 바꾸어줘야 하나요??
    

 

 뭉치v
2012-08-30 22:16
안녕하세요. 

안드로이드 관련 api를 찾다찾다 이렇게 댓글을 남깁니다 ㅠ.ㅠ
제가 php 환경에서 특정 안드로이드 앱의 다운로드 통계 및 리뷰를 갖고오는 작업을 진행중입니다.
인터넷 검색해서 구한 소스보고 수정하면서 테스트를 해보고있긴합니다만, 이상하게도 플레이 구글에서는 검색이 나오는데 제가 구한 api에서는 검색결과를 못 갖고오더라고요;;

여기 들풀님이 작성하신 글을 보니까 데모 페이지 만드셨던데
거기 보니까 제가 구한 api랑 동일한거같아요...
검색을 해봐도 역시 안나오네요...
플레이 구글에서 검색해오는게 아닌거 같은데요. ㅠ.ㅠ

혹시 특정 앱의 다운로드 통계 및 리뷰를 갖고 올 수 있는 방법이 없을까요? 

고수님의 조언 좀 구해봅니다 ㅠ.ㅠ

 

 

=================================

=================================

=================================

 

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=tmakdlf14&logNo=150088766935

1.    안드로이드 어플리케이션 버전 관리 방식

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          
package="string"
          
android:sharedUserId="string"
          
android:sharedUserLabel="string resource" 
          
android:versionCode="integer"
          
android:versionName="string"
          
android:installLocation=["auto" | "internalOnly" |"preferExternal">
    . . .
</manifest>

 

안드로이드 어플리케이션의 버전은 AndroidManifest.xml <manifest> 태그 안에 정의되어 있다. versionCode는 각 버전을 정수 값으로 나타내고이 수치가 더 높으면 최근 버전이라고 간주하게 된다. versionCode는 사용자에게 노출되지 않고 어플리케이션 내부적으로 버전을 비교할 때 사용되며, versionName은 사용자에게 해당 versionCode에 대해 문자열을 통해 나타낼 때 쓰이게 된다.

 

2.    버전 확인을 위한 웹서버 구현

 

안드로이드 어플리케이션 설치 패키지 mime-type :application/vnd.android.package-archive

 

 업데이트된 안드로이드 어플리케이션의 패키지 파일을 배포하기 위해서는 웹서버가 필요하게 된다. Apk 파일을 배포하기 위해서 웹서버에는 Apk 파일에 대한 Mime-Type을 등록하게 된다.

자동 업데이트를 진행하기 위해 어플리케이션은 먼저 웹서버에 접근하여 최근 버전에 해당하는apk 파일을 다운받게 된다.

 

3.    웹서버로부터 apk 패키지 다운로드

 

String url = "http://10.177.243.40:7001/Test/versiontest.apk";
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);

어플리케이션 내에서 apk파일을 다운받는 예제코드는 위와 같다. apk파일의 URL의 문자열 값을Intent ACTION_VIEW 액션과 함께 액티비티를 호출하면 해당 apk sdcard내에 download 폴더 안에 다운받게 된다해당 코드를 통해서 apk를 다운받는 액티비티는 아래 그림과 같다.

 

 

그림 1 apk파일을 다운로드하는 화면

 

위 화면에서 다운로드받은 apk를 클릭하게 되면 안드로이드 패키지 인스톨러가 실행되면서 apk파일을 설치하는 과정으로 넘어가게 된다.

 

 

 

    

그림 2 PackageInstaller Activity, apk를 설치하게 된다.

 

4.    안드로이드 매니페스트 버전 정보 확인 예제 코드

 



PackageInfo pInfo = getPackageManager().getPackageInfo("com.test.versiontest", PackageManager.GET_META_DATA);
    pInfo.versionCode;   //설치되어있는 패키지의 버전 정보
 


PackageInfo pInfo2 = getPackageManager().getPackageArchiveInfo(Environment.getExternalStorageDirectory() + "/download/versiontest.apk", PackageManager.GET_META_DATA);  //다운받은 apk 존재하는 sdcard 경로
pInfo2.versionCode;   //아직 설치되지 않은 apk 패키지의 버전 정보

 

   다운받은 apk 파일을 설치하기 전에현재 설치된 버전과 패키지의 버전을 비교해야 할 경우가 있을 때해당 코드를 통해 버전을 확인하고 apk 파일이 더 최근 버전일 경우 설치 화면으로 이동하도록 구현 한다.

 

5.    sdcard에 있는 apk 패키지를 인스톨하는 방법 – Package Intaller 이용

 

String fileName = Environment.getExternalStorageDirectory() +"/myApp.apk";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)),"application/vnd.android.package-archive");
startActivity(intent);

 

Apk sdcard에 다운받은 이후에, apk 패키지를 설치하기 위한 화면으로 전환하기 위한 코드는 위와 같다. Intent객체 ACTION_VIEW 액션과 setDataAndType 메소드를 통해apk의 파일 경로와 mime-type를 지정한 후에 startActivity메소드에 인자로 넘겨주면플랫폼 내의 PackageInstaller Activity가 실행되게 된다화면은 위의 [그림 2]와 같다.

 

6.    설치된 Apk 패키지를 삭제(uninstall)하는 방법

 

 

 

설치된 안드로이드 어플리케이션을 삭제하기 위한 방법 또한 인텐트를 활용하게 된다.

설치된 어플리케이션의 패키지명을 ACTION_DELETE 액션과 함께 startActivity 메소드를 호출하게 되면 패키지 삭제 액티비티로 이동하게 된다화면은 [그림 3]과 같다.

 

 

 

 

 

 

 

 

그림 3 PackageUninstall Activity, 설치된 패키지를 삭제하게 된다.

 

7.    버전 관리를 위한 Export Signed apk

A.    Keystore 생성

안드로이드 어플리케이션을 배포하기 위해서는 먼저 키를 생성해야 한다키로 서명되지 않은 안드로이드 어플리케이션 패키지(apk)는 디바이스에 설치가 되지 않는다.기본적으로 이클립스를 통해 빌드되는 어플리케이션은 debug.keystore를 통해 서명되지만배포를 위해서는 다시 새로운 키로 서명을 해야만 배포&설치가 가능하다또한 같은 어플을 버전 업데이트해서 다시 배포할 때 같은 키로 서명을 해야만 업데이트가 가능하다.

 

a.     아래는 이클립스에서 키 생성 및 사인 작업을 진행하기 위한 메뉴이다배포하려는 이클립스 패키지에서 마우스 오른쪽 버튼을 눌러 나오는 메뉴에서 Android Tools – Export Signed Applicatoin Package 항목을 선택한다.

 

 

 

b.     기존 키가 있다면 Use existing keystore 항목을 선택하고키를 새로 생성하려 한다면 Create new keystore 항목을 선택한다아래에는 생성된 키 파일의 위치와 암호를 설정한다.

 

 

 

 

 

c.     아래 화면에서는 키와 관련된 부가정보를 입력하게 된다. Alias와 Password는 키를 식별할 수 있도록 생성하고 Validity는 키의 유효기간으로 30년이상의 값을 입력하면 된다그 아래에는 키를 생성하는 기관 정보를 입력하게 된다.

 

 

 

 

d.     다음 화면에서는 apk 패키지 파일을 생성할 경로를 입력한다.

 

 

 

 

 

 

e.     Finish 버튼을 누르면 해당 경로에 apk 파일이 생성된다생성된 apk 파일이 제대로서명 되었는지 확인하기 위해서는 콘솔 창에서 jarsigner 툴을 이용하여 확인 할 수 있다 jarsigner는 android sdk가 아닌 jdk bin 폴더에 있다. Jar verified 라는 메시지가 출력이 되면 정상적으로 서명이 이루어진 것이다.

 

jarsigner -verify -verbose -certs my_application.apk

 

 

 

 

f.      Adb install 명령을 통해 서명된 apk 파일을 설치하면 설치가 정상적으로 되는 것을 확인할 수 있다.

 

 

 

 

 

만약 서명이 제대로 이루어지지 않았다면 다음과 같은 에러메시지가 출력된다.

 

 

 

 

8.    버전 업데이트 시의 현재 문제점

현재 설치되어있는 패키지의 versionCode가 더 높고설치하려는 패키지가 더 낮은versionCode라 하더라고안드로이드는 이전 버전 패키지에 대한 설치를 정상적으로 진행하도록 되어 있다따라서 이전 버전의 패키지 파일이 설치되지 않도록 업데이트 시 설치된 버전과 설치하려는 패키지의 버전을 비교하여 설치하는 패키지가 더 높은 버전일 때만 설치하도록 하는 식의 처리 과정이 필요하다.

[출처] 안드로이드 어플리케이션 자동 업데이트 환경 구현 |작성자 엘모루

 

 

 

=================================

=================================

=================================

 

 

출처: http://webs.co.kr/index.php?document_srl=55708&mid=adnroid&sort_index=readed_count&order_type=asc

 

http://blog.naver.com/PostView.nhn?blogId=lion_kwon&logNo=40191745058

http://wp.goodchois.kr/devtip/archives/372

 

http://code.google.com/p/android-market-api/ 

 

개발자 입장에서 쌔가빠지게 업데이트 게속 해줘도

 

업데이트 하나도 안하는 사용자들이 너무 많다!!

 

주위에 보면 그런 사람 잇더라..

 

그렇다고 따로 서버 둬서 체크하자니까 그냥 앱혼자노는 어플은 부담스럽다

 

구글플레이에 돈주고 개발자 등록했는데 요정도 서비스는 해줘야하는거 아닌가~~

 

 

그렇다 해준다.

 

버전체크 api를 이용해서

 

정보를 가져와서 사용하자~

 

Build.VERSION.SDK_INT 일케 가져온담에 맞춰서 하자

 

 MarketSession session = new MarketSession();
   session.login("id","pw"); // 구글 아무 계정이나 되는듯..?
//   session.getContext.setAndroidId(myAndroidId);

   String query = "com.kwon.kwonyangsanbus"; // 앱 이름 또는 패키지 명 다 쿼리 되는듯.. 근데 내꺼 안뜨냐 ?
   AppsRequest appsRequest = AppsRequest.newBuilder()
                                   .setQuery(query)
                                   .setStartIndex(0).setEntriesCount(10)
                                   .setWithExtendedInfo(true)
                                   .build();

   session.append(appsRequest, new Callback<AppsResponse>() {
            @Override
            public void onResult(ResponseContext context, AppsResponse response) {
                     // Your code here
                     // response.getApp(0).getCreator() ...
                     // see AppsResponse class definition for more infos
             Logger.error("앱갯수 : "+response.getAppCount());
             for(int i = 0 ; i < response.getAppCount(); i++){
              Logger.error(i+"  "+response.getApp(i).getTitle());
              Logger.error(i+"  "+response.getApp(i).getCreator());
              Logger.error(i+"  "+response.getApp(i).getPackageName());
              Logger.error(i+"  "+response.getApp(i).getVersion());
              Logger.error(i+"  "+response.getApp(i).getVersionCode());
             }
            }
   });
   session.flush();

 

 

스레드로 변경

 

//AsyncTask<params,progress,result>

    private class ProcessFacebookTask extends AsyncTask<void, void="" void,="">{

      @Override

               protected Void doInBackground(Void... params) {

                       try

                    {

                        // TODO Auto-generated method stub

                         MarketSession session = new MarketSession();

                           session.login("google_id","google_pw");

                           session.getContext().setAndroidId(androidId(MainActivity.this));

                           String query = "카카오톡";

                           AppsRequest appsRequest = AppsRequest.newBuilder()

                                                           .setQuery(query)

                                                           .setStartIndex(0).setEntriesCount(10)

                                                           .setWithExtendedInfo(true)

                                                           .build();

                           session.append(appsRequest, newCallback<appsresponse>() {

                                    @Override

                                    public void onResult(ResponseContext context, AppsResponse response) {

                                     Logger.error("앱갯수 : "+response.getAppCount());

                                     for(int i = 0 ; i < response.getAppCount(); i++){

                                          Logger.error(i+"title =  "+response.getApp(i).getTitle());

                                          Logger.error(i+"  "+response.getApp(i).getCreator());

                                          Logger.error(i+"  "+response.getApp(i).getPackageName());

                                          Logger.error(i+"  "+response.getApp(i).getVersion());

                                          Logger.error(i+"  "+response.getApp(i).getVersionCode());

                                    }

                                   }

                           });

                           session.flush();

                    }

                    catch (Exception e)

                    {

                      e.printStackTrace();

                    }

                     return null;

               }

    }

 

 

//안드로이드 아이디 가져오기

    public String androidId(Context context) {

        Uri uri = Uri.parse("content://com.google.android.gsf.gservices");

        String key = "android_id";

        String[] paStrings = {key};

        Cursor c = context.getContentResolver().query(uri, null, null, paStrings, null);

        if(!c.moveToFirst() || c.getColumnCount() <2) return "";

        return Long.toHexString(c.getLong(1));

    }

</appsresponse></void,></params,progress,result>

 

 

메니페스트에 권한추가

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES">
</uses-permission>

 

[출처] 안드로이드 구글플레이 버전 등 정보 확인 api|작성자 떡건

 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역