Skip to content Skip to sidebar Skip to footer

Start Chrome As Web-app On Android Start

i have a quite specific problem. I have realized a Web App on an Android tablet, which will be used on an exhibition (Outform iDisplay). For this reason, the Web App has to start d

Solution 1:

Finally i got this thing working. I was on the right way, but some Chrome.apk reverse engineering helped me for the last mile. I have created a dummy activity with the following code in onCreate:

Search for the right entry on the homescreen, in my case for the AOSP launcher 3:

//Search for the History Book Shortcut on the HomescreenStringurl="";
    String runAction="";

    finalStringAUTHORITY="com.android.launcher3.settings";
    finalUriCONTENT_URI= Uri.parse("content://" +
    AUTHORITY + "/favorites?notify=true");

    finalContentResolvercr= getContentResolver();
    Cursorcursor= cr.query(CONTENT_URI,null,null,null,null);

    cursor.moveToFirst();
    do {
        Stringid= cursor.getString(cursor.getColumnIndex("_id"));
        Stringtitle= cursor.getString(cursor.getColumnIndex("title"));
        Stringintent= cursor.getString(cursor.getColumnIndex("intent"));
        if(title.equals(getResources().getString(R.string.homescreen_link)))
        {
            runAction = intent;
        }

    } while (cursor.moveToNext());

At this point, i have hopefully the intent as string. So, parse the string and create a new intent:

    Intent intent = new Intent();
    intent.setAction("com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP");
    intent.setPackage("com.android.chrome");
    intent.setClassName("com.android.chrome", "com.google.android.apps.chrome.webapps.WebappManager");

    HashMap<String, String> intentVals = getIntentParams(runAction);

    intent.putExtra("org.chromium.chrome.browser.webapp_title",intentVals.get("S.org.chromium.chrome.browser.webapp_title"));
    intent.putExtra("org.chromium.chrome.browser.webapp_icon",intentVals.get("S.org.chromium.chrome.browser.webapp_icon"));
    intent.putExtra("org.chromium.chrome.browser.webapp_id",intentVals.get("S.org.chromium.chrome.browser.webapp_id"));
    intent.putExtra("org.chromium.chrome.browser.webapp_url",intentVals.get("S.org.chromium.chrome.browser.webapp_url"));
    intent.putExtra("org.chromium.chrome.browser.webapp_mac",intentVals.get("S.org.chromium.chrome.browser.webapp_mac"));
    int orientation = 6;
    try
    {
        orientation = Integer.parseInt(intentVals.get("i.org.chromium.content_public.common.orientation"));
    }
    catch(NumberFormatException _nex)
    {
        Log.e(TAG, "Wrong format, using default (6)");
    }
    intent.putExtra("org.chromium.content_public.common.orientation", orientation);

    try
    {
        byte[] abyte0 = Base64.decode(
                intentVals.get("S.org.chromium.chrome.browser.webapp_mac"),
                0);
        System.out.println(new String(abyte0));
    }
    catch (IllegalArgumentException _iae)
    {
        Log.e(TAG,
                "Wrong webapp_mac: "
                        + intentVals
                                .get("S.org.chromium.chrome.browser.webapp_mac"));
    }

    startActivity(intent);
    finish();

And this function parses the intent parameters out of the intent string:

privateHashMap<String, String> getIntentParams(String _runAction)
{       
    HashMap<String, String> retMap = newHashMap<String, String>();

    String[] pairs = _runAction.split(";");
    for (int i = 0; i < pairs.length; i++)
    {
         String[] keyval = pairs[i].split("=");
         if(keyval.length==2)
         {
            String key = keyval[0];
            String value = "";
            try
            {
                value = java.net.URLDecoder.decode(keyval[1], "UTF-8");
            }
            catch (UnsupportedEncodingException _uee)
            {
                Log.e(TAG, "Unsupported Encoding: " + _uee.getMessage());
            }
            retMap.put(key, value);
         }
    }
    return retMap;
}

And the strings.xml in res/values:

<?xml version="1.0" encoding="utf-8"?><resources><stringname="app_name">WebAppStarter</string><stringname="homescreen_link">History Book</string></resources>

That's it. You can configure the Homescreen link name to search for in strings.xml. When the app finds the string, it parses the intent string and creates a new intent to start Chrome as a Full Screen Activity Web App.

Post a Comment for "Start Chrome As Web-app On Android Start"