Note that there are some explanatory texts on larger screens.

plurals
  1. POImplementing Google Play Application Silent Install Feature On Android
    primarykey
    data
    text
    <p>Hi Experts / Expert Hackers,</p> <p>I'm trying to implement the Google Play application silent install feature (similar to appbrain fast web installer) on android. </p> <p>So far I was able achieve the following :</p> <ol> <li><p>Find out a method to retrieve the Google Play Auth Token (thus granting permission for my application to talk with Google Play application on the Phone). I've listed the code I've used for this below :</p> <pre><code> Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : START"); AccountManager accountManager = AccountManager.get(getApplicationContext()); Account[] accArr = accountManager.getAccountsByType("com.google"); for (Account acc : accArr) { Log.i(TAG, "For Account Name : " + acc.name + " - "+ "Account Type : " + acc.type); accountManager.getAuthToken(acc, "googleplay", null, this,new AccountManagerCallback&lt;Bundle&gt;() { public void run( AccountManagerFuture&lt;Bundle&gt; paramAccountManagerFuture) { try { Bundle localBundle = (Bundle) paramAccountManagerFuture.getResult(); String authToken = localBundle.get("authtoken") + ""; Log.i(TAG, "Got AuthToken : " + authToken); } catch (Exception ex) { StackTraceElement[] starray = ex.getStackTrace(); StringBuffer bf = new StringBuffer(); bf.append("Error : " + ex.getMessage()).append("\n"); for (StackTraceElement ste : starray) { bf.append(ste.toString()).append("\n"); } Log.e(TAG, bf.toString()); } } }, null); } Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : END") </code></pre></li> <li><p>Find out how to Retrieve the Android-Id of the Phone (This Id as I believe should be used when sending the appInstall request to the GPlay Servers or the Gplay/vending application on the android phone)</p> <pre><code> Log.i(TAG, "Getting the Android ID Of the Phone : START"); Uri localUri = Uri.parse("content://com.google.android.gsf.gservices"); ContentResolver localContentResolver = getContentResolver(); String[] arrayOfString = new String[1]; arrayOfString[0] = "android_id"; Cursor localCursor = localContentResolver.query(localUri, null,null, arrayOfString, null); Log.i(TAG, "Column Count : " + localCursor.getColumnCount()); if ((localCursor != null) &amp;&amp; (localCursor.moveToFirst())) { String androidId = Long.toHexString(Long.parseLong(localCursor.getString(1))); Log.i(TAG, "Received Android ID : " + androidId); Log.i(TAG,"Other Value in Column : " + localCursor.getString(0)); } Log.i(TAG,"Getting the Android ID of the Phone : END"); </code></pre></li> <li><p>Find out the Protocol Buffer Request to be sent to the Google Play servers or the Gplay/vending application on the phone to Initiate the silent application download &amp; install process.</p> <pre><code>message InstallRequest { optional string appId = 1; } message RequestContext { required string authSubToken = 1; required bool isSecure = 2; required int32 version = 3; required string androidId = 4; optional string deviceAndSdkVersion = 5; optional string userLanguage = 6; optional string userCountry = 7; optional string operatorAlpha = 8; optional string simOperatorAlpha = 9; optional string operatorNumeric = 10; optional string simOperatorNumeric = 11; } message Request { optional RequestContext context = 1; repeated group RequestGroup = 2 { optional InstallRequest installRequest = 10; } } </code></pre></li> </ol> <p>4.I even used the protobuf compiler and generated the java class for manipulating the above protocol buffer request and filled the above protocol buffer fields with some sample data. See the code below :</p> <pre><code> public void buildAndSendSilentInstallProtoBuffMessage(String gplayAuthToken, String deviceAndroidId){ try{ /* * The Root Request Object Assumed to be Holding the Silent Install Request */ Request.Builder request = Request.newBuilder(); //Populating the ReequestContext Object RequestContext.Builder context = RequestContext.newBuilder(); context.setAndroidId(deviceAndroidId); context.setAuthSubToken(gplayAuthToken); context.setIsSecure(true); context.setVersion(1002); context.setDeviceAndSdkVersion("dream:4"); context.setUserLanguage("en"); context.setUserCountry("us"); context.setOperatorAlpha("Android"); context.setOperatorNumeric("310260"); context.setSimOperatorNumeric("310260"); //Building the Install Request InstallRequest.Builder installRequest = InstallRequest.newBuilder(); installRequest.setAppId("-2564446724934482383"); //Setting the Install Request to the Request Group RequestGroup.Builder requestGroup = RequestGroup.newBuilder(); requestGroup.setInstallRequest(installRequest); //Setting the Request Context to the Main Request Object request.setContext(context); //Setting the Request Group to the Request Object request.addRequestGroup(requestGroup); </code></pre> <p>The Sample Data for GPlay Token and the Android Id are as follows :</p> <ol> <li>Android_ID : </li> </ol> <p>3a0f901831a0f402</p> <ol> <li>Google Play AuthToken :</li> </ol> <p>DQAAAMgAAACpOyPf6apRbb0i4qhTVaf0yYoikTAb4TYlHCRLrW 4mu5f14j-H35KGmO9TQKUDYCfj3-b-QIH5chfXT3bS02Uxljg7vYt4I-kgXLEJwPcynjugDcJ9fYPOh1c2FnOnywFXXxXw6hcqs5sVnJEt 5zW2ditoB5VeeXG9Zfodj9dXKobObi50-XnHoGfWi2b64Uf3EHGdQTsDCMzfZrE4mb22fr9LCW1oZG5tkzw S4KhPBHWMN2fO7w-1IZ4UK5LOI80vPBLjxBaavKAXHoVUHSNV</p> <ol> <li>I also did some sniffing using my rooted galaxy nexus phone during Gplay application silent install and found only two HTTP GET Requests.</li> </ol> <p>I tried reproducing the those two Http GET requests captured using Shark for root(using my rooted android galaxy nexus phone) and the 1st Request just downloads the Market File itself (which I was able to save to the SD card of the Phone. But then it has to be installed like any unknown sources application) while the second request returns nothing. </p> <p>The two get requests captured are shown below :</p> <ol> <li><p>GET REQUEST ONE :</p> <pre><code>21 0.827240 192.168.135.102 173.194.36.4 HTTP 535 GET /market/download/Download? packageName=com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld&amp;versionCode=1&amp;token=AOTCm0QRnH3rmypWtCGoAL_SU1BSt311wpyz-_LZTodkUSAlc- f5SrdMiz5WDRDUKMMm6S3plBI9Jbh1tukT1jyCYXLgP4QhVvZvn5JLtZQ&amp;downloadId=-165214892049282883 HTTP/1.1 Which has the following http headers : Cookie: MarketDA=17214805622679635526\r\n Host: android.clients.google.com\r\n Connection: Keep-Alive\r\n User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus Build/JRO03C)\r\n </code></pre></li> <li><p>GET REQUEST TWO :</p> <pre><code>44 6.595093 192.168.135.102 222.165.163.15 HTTP 608 GET /market/GetBinary/com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld/1?expire=1346838270&amp;ipbits=0&amp;ip=0.0.0.0&amp;cp=SnpybWlzSFk6OTYzMzg0MTE2NzA1ODEwOTYxMjE&amp;sparams=expire,ipbits,ip,q:,cp&amp;signature=2C0778C4635F6F8AE1DA8479FB08DCB9BC04C2E9.60202D8D4D2FDDA70609A3862A25852F0BAA2766&amp;key=am2 HTTP/1.1 Which has the following http headers : Cookie: MarketDA=17214805622679635526\r\n Host: o-o.preferred.slt-cmb2.v12.lscache4.c.android.clients.google.com\r\n Connection: Keep-Alive\r\n User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus Build/JRO03C)\r\n </code></pre></li> </ol> <p>I've been looking into this for about two weeks now but I still couldn't find the following :</p> <ol> <li><p>Whether the AppBrain fast Web Installer uses the protocol buffer to invoke the Gplay (vending application) on the phone or the Gplay servers ?. If so is the above Protocol Buffer Request format correct ??.</p></li> <li><p>If the Above Protocol Buffer Request format is correct then to Where in the Phone or Gplay server should I send the Protocol buffer request to to invoke the Silent Application download and installing procedure ?.</p></li> </ol> <p>I also have a C2DM (now GCM) server and client setup around this task as well. Could anyone point me in the correct direction or give me any clues for solving this ?. Any help is much appreciated .</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload