html中其实是无法判断应用是否安装,除非在webview中通过js bridge,这里通过一种方式达到此目的。

1、编辑AndroidManifest.xml:

主要是增加第二个,myapp用来标识schema,最好能保证手机系统唯一,那样就可以打开应用,而不是弹出一个选择框。

Android:pathPrefix标识url的path,可以附带自己的数据通过string传递到activity,比如完整url为 myapp://xxx/openwith?data=mydata

**[html]** [view plain](http://blog.csdn.net/vinrex/article/details/38082759#) [copy](http://blog.csdn.net/vinrex/article/details/38082759#)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1" data-mce-fragment="1">
    </embed>
  </div>
</div>
- <span class="tag"><</span><span class="tag-name">activity</span>

- <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;com.abc.MainActivity&#8221;</span>

- <span class="attribute">android:configChanges</span>=<span class="attribute-value">&#8220;orientation|keyboardHidden|navigation|screenSize&#8221;</span>

- <span class="attribute">android:screenOrientation</span>=<span class="attribute-value">&#8220;landscape&#8221;</span>

- <span class="attribute">android:theme</span>=<span class="attribute-value">&#8220;@android:style/Theme.NoTitleBar.Fullscreen&#8221;</span> <span class="tag">></span>

- <span class="tag"><</span><span class="tag-name">intent-filter</span><span class="tag">></span>

- <span class="tag"><</span><span class="tag-name">action</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.action.MAIN&#8221;</span> <span class="tag">/></span>

- <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.LAUNCHER&#8221;</span> <span class="tag">/></span>

- <span class="tag"></</span><span class="tag-name">intent-filter</span><span class="tag">></span>

- <span class="tag"><</span><span class="tag-name">intent-filter</span><span class="tag">></span>

- <span class="tag"><</span><span class="tag-name">action</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.action.VIEW&#8221;</span> <span class="tag">/></span>

- <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.BROWSABLE&#8221;</span> <span class="tag">/></span>

- <span class="tag"><</span><span class="tag-name">category</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.intent.category.DEFAULT&#8221;</span><span class="tag">/></span>

- <span class="tag"><</span><span class="tag-name">data</span> <span class="attribute">android:scheme</span>=<span class="attribute-value">&#8220;myapp&#8221;</span> <span class="attribute">android:pathPrefix</span>=<span class="attribute-value">&#8220;/xxx/openwith&#8221;</span> <span class="tag">/></span>

- <span class="tag"></</span><span class="tag-name">intent-filter</span><span class="tag">></span>

- t;/activity<span class="tag">></span>

然后通过activity获得data数据:

**[java]** [view plain](http://blog.csdn.net/vinrex/article/details/38082759#) [copy](http://blog.csdn.net/vinrex/article/details/38082759#)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2" data-mce-fragment="1">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) {

- Uri uridata = <span class="keyword">this</span>.getIntent().getData();

- String mydata = uridata.getQueryParameter(<span class="string">&#8220;data&#8221;</span>);

- &#8230;

- }

** **

**  2、编写html页面:**

整个页面也许是某个app的详细介绍,这里只写出关键的js代码:

**[javascript]** [view plain](http://blog.csdn.net/vinrex/article/details/38082759#) [copy](http://blog.csdn.net/vinrex/article/details/38082759#)
  <div>
    <embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_3" data-mce-fragment="1">
    </embed>
  </div>
</div>
- <span class="keyword">function</span> openApp() {

- 
- <span class="keyword">if</span> (/android/i.test(navigator.userAgent)) {

- <span class="keyword">var</span> isrefresh = getUrlParam(<span class="string">&#8216;refresh&#8217;</span>); <span class="comment">// 获得refresh参数</span>

- <span class="keyword">if</span>(isrefresh == 1) {

- <span class="keyword">return</span>

- }

- window.location.href = <span class="string">&#8216;myapp://xxx/openwith?data=mydata&#8217;</span>;

- window.setTimeout(<span class="keyword">function</span> () {

- window.location.href += <span class="string">&#8216;&refresh=1&#8217;</span> <span class="comment">// 附加一个特殊参数,用来标识这次刷新不要再调用myapp:// 了</span>

- }, 500);

- }

- 
- }

上面代码可以达到这样一个目的,先请求 myapp:// ,如果系统能处理,或者说已经安装了myapp表示的应用,那么就可以打开,另外,如果不能打开,直接刷新一下当前页面,等于是重置location。

💬 评论