1. 程式人生 > >Android H5和App互動以及開啟相簿上傳圖片並顯示

Android H5和App互動以及開啟相簿上傳圖片並顯示

一、H5連結開啟App

點選瀏覽器中的URL,如何啟動App呢?

1、HTML連結處理

首先做成HTML的內容,url格式如下:

<a href="[scheme]://[host]/[path]?[query]">啟動應用程式</a>
說明

schema: 判斷啟動的App

host: 標記

path: 標記,可無

query:  傳值的(key,value)鍵值對,可無

例如:

<a href="myapp://jp.app/openwith?name=zhangsan&age=26">啟動應用程式</a>  

本例中做如下超連結跳轉:

<a href="finance://pay.com/mpos?orderId=1020160126"> Open APP </a>

其中:

   schema  ----  finance   對應android中 android:schema

    host ---  pay.com   對應android中 android:host

     path ---  mpos   對應android中 android:pathPrefix

    query --- orderId=1020160102  為Html連結和APP相互傳遞的資料,可以在Uri中通過getQueryParameter 方法獲取

全部Html原始碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>mpos</title>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">
<meta name="imagemode" content="force">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
</head>
<body>
<h1>H5開啟APP</h1>
<a href="finance://pay.com/mpos?orderId=102016000"> Open APP </a>
</body>
</html>

2、android中如何處理?

1)在AndroidManifest.xml檔案中,在需要跳轉到的Activity中新增如下宣告:

     <activity
            android:name=".ui.activity.OrderDetailActivity"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/CustomTitle">

            <intent-filter>
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.VIEW" />
                <data
                    android:host="pay.com"
                    android:pathPrefix="/mpos"
                    android:scheme="finance" />
            </intent-filter>
        </activity>

2)如何獲取連結中傳遞的資料?

if (getIntent() != null) {
	if (Intent.ACTION_VIEW.equals(action)) {
              	Uri uri = Uri.parse(getIntent().getDataString());
              	if (uri != null) {
			String orderId = uri.getQueryParameter("orderId");
		}
	}
 }
3、應該注意的地方?

1)連結開啟的Activity中,【android.intent.action.MAIN】和【android.intent.category.LAUNCHER】這2個,不能與這次追加的內容混合在一起;如果跳轉的剛好是啟動Activity,可以寫一個類繼承啟動類。

2)參考:http://blog.csdn.net/jiangwei0910410003/article/details/23940445

二、App開啟H5

使用WebView載入,傳值可參考框架JsBridgeWebView。

載入遠端html:webView.loadUrl("http://www.baidu.com");

載入本地html:webView.loadUrl("file:///android_asset/web_app.html");

三、App開啟App

例如,點選app1某個頁面中的按鈕,要開啟app2,

1、先檢測是否安裝了app2,客人通過包名檢測;

2、安裝,例如開啟微信,如果沒有安裝就跳轉到下載頁:

try {
			PackageManager packageManager = getPackageManager(); 
			Intent intent=new Intent(); 
			intent = packageManager.getLaunchIntentForPackage("com.tencent.mm");
			startActivity(intent);
		} catch (Exception e) {
			e.printStackTrace();
			Intent viewIntent = new
			Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/"));
			startActivity(viewIntent);
}

或者

Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);            
		ComponentName cn = new ComponentName(app2PackageName, className);            
		intent.setComponent(cn);
		startActivity(intent);

3、如何從.aar中的某個頁面跳轉到主專案的某個頁面?

使用隱式Intent跳轉,具體如下:

1)主專案中:

<activity
            android:name="com.ddqb.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.ddqb.MainActivity"/>
                <category android:name="android.intent.category.DEFAULT" />  <!--要設定一下category-->
            </intent-filter>
        </activity>
findViewById(R.id.enter_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(LoginTestAcitvity.this, TestActivity.class);  // TestActivity為.aar依賴庫中的頁面
                startActivity(intent);

            }
        });
2).aar專案中:
findViewById(R.id.btn_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("com.ddqb.MainActivity");
                intent.addCategory("android.intent.category.DEFAULT");
                TestActivity.this.startActivity(intent);
            }
        });

四、H5與App互動

1、WebView基礎設定如下:

String mUrl = "http://10.0.41.19:8099/TomcatTest/web_app_upload_image.html";
        WebSettings webSettings = webView.getSettings();
        //設定WebView屬性,能夠執行Javascript指令碼
        webSettings.setJavaScriptEnabled(true);
        //設定可以訪問檔案
        webSettings.setAllowFileAccess(true);
        //設定支援縮放
        webSettings.setBuiltInZoomControls(true);
        //載入需要顯示的網頁
        // 載入 asset目錄下的本地html檔案: mUrl = "file:///android_asset/web_app.html"
        webView.loadUrl(mUrl);
        //設定WebViewClient用來輔助WebView處理各種通知請求事件等,如更新歷史記錄、網頁開始載入/完畢、報告錯誤資訊等
        webView.setWebViewClient(new WebViewClient() {

            // 以下方法避免 自動開啟系統自帶的瀏覽器,而是讓新開啟的網頁在當前的WebView中顯示
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        // 用於輔助WebView處理JavaScript的對話方塊、網站圖示、網站標題以及網頁載入進度等
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                tv_title.setText(title);
            }
        });
        // 使 H5可呼叫Native方法: android.nativeMethod()
        webView.addJavascriptInterface(new MyJsInterface(), "android");
2、H5 呼叫 Native 方法實現 H5頁面 按鈕點選事件處理,程式碼如下:
<input type="button" value="JS Call Native: Toast Message" onclick="android.toastMessage()"> 
     App WebViewActivity類中處理:
public class MyJsInterface {

        @JavascriptInterface
        public void toastMessage(String msg) {
            Toast.makeText(WebViewActivity.this, "app to H5 toast " + msg, Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(WebViewActivity.this, FirstActivity.class);
            WebViewActivity.this.startActivity(intent);
        }
3、Native 傳遞資料給 H5,場景:點選原生頁面的標題欄按鈕,給H5頁面傳值 並且更新 H5頁面:
        // 點選原生按鈕,向H5頁面傳送資料,可更新H5頁面
        tv_click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = "from Native";
                // loadUrl必須在主執行緒中執行
                webView.loadUrl("javascript:toNative('" + msg + "')");
            }
        });
     H5 中頁面資料更新程式碼:
 <input type="text" value="hhhh" id="pp"/>
 
<script type="text/javascript"> 
	// 2. js供 Native 呼叫的方法
	function toNative(msg) {
		alert("Hello, from H5, received msg: " + msg);
		var p = document.getElementById("pp");
		p.value = msg;
	}
</script> 

五、H5頁面從App相簿中選擇圖片並在H5頁面顯示所選圖片:

步驟一:重寫onShowFileChooser / openFileChooser 方法(還要相容其他各個版本)

private static final int REQUEST_LOAD_IMAGE_FROM_GALLERY = 0x10;
    private ValueCallback<Uri> mSingleFileCallback;
    private ValueCallback<Uri[]> mMultiFileCallback;
    private Uri imageUri;
    private void setWebChromeClient() {
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                tv_title.setText(title);
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                Log.e("Webview", "onShowFileChooser");
                mMultiFileCallback = filePathCallback;
                openGallery();

                return true;  // 一定要return true 防止下次回到 WebView頁面重新呼叫,拋異常 duplicate result
            }

            // 5.0以下的檔案上傳監聽方法
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                Log.e("Webview", "openFileChooser");
                mSingleFileCallback = uploadMsg;
                openGallery();
            }
        });
    }

    private void openGallery() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_LOAD_IMAGE_FROM_GALLERY);
    }
步驟二:在onActivityResult 中獲取所選圖片 uri,回撥給 H5(目前程式碼有點小缺陷,圖片需要壓縮,因為在H5載入 base64本地圖片是耗時操作,要先壓縮圖片);
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_LOAD_IMAGE_FROM_GALLERY) {
            if (mSingleFileCallback == null && mMultiFileCallback == null) {
                return;
            }
            Uri tempUri = null;
            if (data != null) {
                String url = CommonUtil.getPath(WebViewActivity.this, data.getData());
                File temp = new File(url);
                tempUri = Uri.fromFile(temp);
            }

            if (mSingleFileCallback != null) { // 5.0以下處理方式
                if (data != null) {
                    mSingleFileCallback.onReceiveValue(tempUri);
                } else {
                    mSingleFileCallback.onReceiveValue(imageUri);
                }
                mSingleFileCallback = null;
            } else if (mMultiFileCallback != null) { // 5.0版本以上
                Uri[] uris = null;
                if (data == null) {
                    uris = new Uri[] {imageUri};
                } else {
                    // 多選圖片[圖片一定要壓縮,轉化為base網頁載入很慢]
                    String dataString = data.getDataString();
                    ClipData clipData = data.getClipData();
                    if (clipData != null) {
                        int size = clipData.getItemCount();
                        uris = new Uri[size];
                        for (int i = 0; i < size; i++) {
                            // 將所選圖片的 url儲存到 uris陣列中
                            uris[i] = clipData.getItemAt(i).getUri();
                        }
                    }
                    if (!TextUtils.isEmpty(dataString)) {
                        uris = new Uri[] {Uri.parse(dataString)};
                    }
                }

                if (uris == null) {
                    mMultiFileCallback.onReceiveValue(null);
                    mMultiFileCallback = null;
                } else {
                    mMultiFileCallback.onReceiveValue(uris);
                    mMultiFileCallback = null;
                }
            }
        }
    }
步驟三:在html頁面中,使用 FileReader 獲取上傳的圖片base64編碼並顯示在img標籤:
<input accept="image/*" capture="camera" id="imgFile" name="imgFile"  type="file"  onchange="previewFile()" > <br/>
 <p></p>
 <img src="" id="img" /> 
function previewFile() {
		var img = document.getElementById("img");
		// 僅限上傳單張圖片
	    var file = document.querySelector('input[type=file]').files[0];
	    
	    var reader  = new FileReader();	    	    
		reader.addEventListener("load", function () {
			    img.src = reader.result;  // 儲存在本地的圖片的base64編碼
			    alert("result=" + reader.result);
	    }, false);

	    if (file) {
	      reader.readAsDataURL(file);
	    }
	 }

相關推薦

Android H5App互動以及開啟相簿圖片顯示

一、H5連結開啟App 點選瀏覽器中的URL,如何啟動App呢? 1、HTML連結處理 首先做成HTML的內容,url格式如下: <a href="[scheme]://[host]/[path]?[query]">啟動應用程式</a> 說明:

android 開啟攝像頭以及選取相簿照片剪裁圖片使用比例壓縮大小

        之前搜尋了各種網上的開啟攝像頭拍照和選取相簿的方式,發現大部分都不太相容、適合。因此在這裡總結一下切實可用的方法(參考第一行程式碼)         拍照使用的是FileProvider,這

[Android] WebView中拍照或從相簿圖片

  WebView 上傳圖片, 想必很多人都碰到過這樣的場景. 而且 WebView 在4.4前後的區別非常大, 比如對URL跳轉的格式, 對JS的注入宣告等等, 4.4以後的WebView 已經是chromium核心, 有多強大就無需我贅述. 說這些, 其實也

Android——從本地相簿圖片至伺服器

android實現本地圖片上傳至服務端,只需幾步操作即可實現,下面一起看看。 首先看下效果: 主要程式碼: package com.kevin.imageuploadclient.fragment; import android.graphics

配置好fastfdsnginx,eclipse用程式碼圖片失敗

1、提示:timed out,22122 說明無法訪問22122的埠 有可能是虛擬機器網絡卡沒開,也有可能是虛擬機器22122埠未開啟。 兩個都開啟後還是不行。 我就想知道主機能不能訪問虛擬機器的22122埠。網上找到了用命令 telnet ip 埠    測試如下

WebView中拍照或從相簿圖片

WebView 上傳圖片, 想必很多人都碰到過這樣的場景. 而且 WebView 在4.4前後的區別非常大, 比如對URL跳轉的格式, 對JS的注入宣告等等, 4.4以後的WebView 已經是chromium核心, 有多強大就無需我贅述. 說這些, 其實也是

apicloud相機及從相簿圖片剪下

<template> <div class="chat" style="font-size: 0.16rem"> <img :src=tu /> <div @click="bb">點選上傳圖片</div> &

JavaPHP兩種方式實現圖片到新浪微博的圖床

這幾天遇到一個需求,需要將圖片上傳到新浪微博的圖傳,研究了一下, 特此記錄1.模擬登陸,獲取cookie登入地址為:https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=140313

[Swift通天遁地]四、網路執行緒-(9)圖片實時顯示進度

本文將演示上傳圖片至伺服器,並實時顯示上傳的進度。 首先確保在專案中已經安裝了所需的第三方庫。 點選【Podfile】,檢視安裝配置檔案。 1 source 'https://github.com/CocoaPods/Specs.git' 2 platform :ios, '12.0' 3 u

web app專案使用uploadifive外掛圖片

做了一個微信公眾號的專案,需要上傳使用者的照片資料。使用了uploadifive.js外掛做的圖片上傳。 具體操作如下: 參考文件: 1.引入相關js <link rel="stylesheet" href="static/css/uplo

java ssh視訊顯示縮圖以及視訊在網頁中的播放

非原創,整合網上的各個步驟及自己的實施 一.上傳視訊 使用以下htm標籤即可 <form name="uploadForm" method="post" enctype="multipart/form-data" action="xxx" <td><input

Android基礎-獲取網路圖片顯示

android手機和瀏覽器也是一樣的,也可以通過網路通訊獲取資料,如呼叫webservice,EJB等。下面就通過一個小例子從網路獲取一幅圖片並顯示在手機上,開發中將會使用到一個新的元件ImageView. 設計效果圖: 1.在AndroidManife

C# winform 圖片顯示圖片gridview中新增按鈕

上傳圖片,顯示圖片using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syst

android+html5圖片顯示圖片頭部部分

應公司要求用android+html5開發,其中上傳圖片遇到奇葩的問題。 1、上傳圖片是把bitmap轉byte轉base64 2、放在img標籤顯示 步驟很清晰,這樣可以實現啊,對吧: 先做個實驗,把base64碼控制檯打印出來,然後放在img標籤顯示,看看行不行。。。。

android圖片附帶資料,檔案流

package cn.back.servlet.app; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLD

呼叫系統相簿圖片到伺服器--OPPO等部分手機出現短暫的顯示桌面問題

主要原因是主體樣式設定的問題:這裡把appTheme設定一個style即可:         <item name="android:windowBackground">@color/white</item>         <!--下面這個屬

php + js 實現拖拽 以及 複製貼上圖片

/**xeditor.js**/ xeditor_config = {basePath:'xeditor/' };//xeditor路徑 (function ($) {//阻止瀏覽器預設行。      $.fn.extend({         "setup": funct

NotificationManagerService啟動流程以及app互動實現原理

SystemServer啟動(main方法被呼叫) public final class SystemServer { public static void main(String[] args) { new SystemServer

android:themeapp:popupTheme的作用,以及android 3.0以下不起作用問題的解決

在android5.0中,新增了Material Design設計語言,確實挺炫的,使用Toolbar代替了之前的Actionbar確實靈活很多。 之前我們只能在application或者activi

xamarin.form 使用WebViewAPP互動

<WebView Source="https://www.baidu.com"> </WebView>   可以用後臺程式碼和webview互動,例如webview.Eval("alert('hello')"); xamarin.form原生webvi