WebView如何調(diào)用系統(tǒng)的相機(jī)和相冊(cè)上傳文件

大家可以通過(guò)產(chǎn)看WebViewClient這個(gè)類(lèi)里面的源碼可知囚痴,在下面的幾個(gè)方法里面5.0以下是通過(guò)ValueCallback<Uri>uploadMsg 來(lái)向webview上傳我們通過(guò)拍照或相冊(cè)里面獲取到的uri而在5.0以上是通過(guò)ValueCallback<Uri[]>filePathCallback 來(lái)上傳,大家注意這里變成了一個(gè)Uri類(lèi)型的數(shù)組,然后我們只需要在我們的openFileChoose()和onShowFileChooser()里面寫(xiě)我們調(diào)用系統(tǒng)相機(jī)和相冊(cè)的代碼了然后在onActivityResult里面獲取Uri郑原,

我們首先要分別聲明ValueCallback<Uri>和ValueCallBack<Uri[]>在openFileChoose和onShowFileChooser里面進(jìn)行賦值就像我下面代碼一樣

private ValueCallback<Uri> mUploadMessage;// 表單的數(shù)據(jù)信息
private ValueCallback<Uri[]> mUploadCallbackAboveL;
private final static int FILECHOOSER_RESULTCODE = 1;// 表單的結(jié)果回調(diào)
private Uri imageUri;

/**
* web視圖
*/
mWebView.setWebChromeClient(new WebChromeClient() {
//設(shè)置網(wǎng)頁(yè)加載的進(jìn)度條
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
//android>5.0調(diào)用這個(gè)方法
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
mUploadCallbackAboveL=filePathCallback;
take();
return true;
}
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage=uploadMsg;
take();
}
public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType) {
mUploadMessage=uploadMsg;
take();
}
public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType, String capture) {
mUploadMessage=uploadMsg;
take();
}
});
if (!TextUtils.isEmpty(mWebUrl)) {
mBrowserLayout.loadUrl(mWebUrl);
} else {
Toast.makeText(this, "獲取URL地址失敗", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (mUploadCallbackAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, data);
}
else if (mUploadMessage != null) {
Log.e("result",result+"");
if(result==null){
// mUploadMessage.onReceiveValue(imageUri);
mUploadMessage.onReceiveValue(imageUri);
mUploadMessage = null;

Log.e("imageUri",imageUri+"");
}else {
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}


}
}
}

@SuppressWarnings("null")
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
if (requestCode != FILECHOOSER_RESULTCODE
|| mUploadCallbackAboveL == null) {
return;
}

Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (data == null) {
results = new Uri[]{imageUri};
} else {
String dataString = data.getDataString();
ClipData clipData = data.getClipData();

if (clipData != null) {
results = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
results[i] = item.getUri();
}
}

if (dataString != null)
results = new Uri[]{Uri.parse(dataString)};
}
}
if(results!=null){
mUploadCallbackAboveL.onReceiveValue(results);
mUploadCallbackAboveL = null;
}else{
results = new Uri[]{imageUri};
mUploadCallbackAboveL.onReceiveValue(results);
mUploadCallbackAboveL = null;
}

return;
}

private void take(){
File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
// Create the storage directory if it does not exist
if (! imageStorageDir.exists()){
imageStorageDir.mkdirs();
}
File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
imageUri = Uri.fromFile(file);

final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for(ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent i = new Intent(captureIntent);
i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
i.setPackage(packageName);
i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
cameraIntents.add(i);

}
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
Intent chooserIntent = Intent.createChooser(i,"Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
ServiceWebActivity.this.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澡腾,隨后出現(xiàn)的幾起案子凯亮,更是在濱河造成了極大的恐慌,老刑警劉巖冻辩,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖腕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恨闪,警方通過(guò)查閱死者的電腦和手機(jī)倘感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咙咽,“玉大人老玛,你說(shuō)我怎么就攤上這事【ǎ” “怎么了蜡豹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)溉苛。 經(jīng)常有香客問(wèn)我镜廉,道長(zhǎng),這世上最難降的妖魔是什么愚战? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任娇唯,我火速辦了婚禮,結(jié)果婚禮上寂玲,老公的妹妹穿的比我還像新娘塔插。我一直安慰自己,他們只是感情好拓哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布想许。 她就那樣靜靜地躺著,像睡著了一般断序。 火紅的嫁衣襯著肌膚如雪流纹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天违诗,我揣著相機(jī)與錄音漱凝,去河邊找鬼。 笑死较雕,一個(gè)胖子當(dāng)著我的面吹牛碉哑,可吹牛的內(nèi)容都是我干的挚币。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扣典,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妆毕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贮尖,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笛粘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后湿硝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薪前,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年关斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了示括。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痢畜,死狀恐怖垛膝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丁稀,我是刑警寧澤吼拥,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站线衫,受9級(jí)特大地震影響凿可,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜授账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一枯跑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矗积,春花似錦全肮、人聲如沸敞咧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)休建。三九已至乍恐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間测砂,已是汗流浹背茵烈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌些,地道東北人呜投。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓加匈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仑荐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雕拼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容