Android使用webView長(zhǎng)按保存下載網(wǎng)絡(luò)圖片
本文實(shí)例為大家分享了Android使用webView長(zhǎng)按保存下載網(wǎng)絡(luò)圖片的具體代碼,供大家參考,具體內(nèi)容如下
最近發(fā)現(xiàn)在webView的setOnLongClickListener中可以獲取到WebView.HitTestResult,根據(jù)獲取的HitTestResult的Type來(lái)判斷做不同的處理。通過(guò)判斷Type的類型獲取點(diǎn)擊圖片的url,然后把圖片下載到本地,發(fā)送廣播通知系統(tǒng)圖庫(kù)進(jìn)行更新,在系統(tǒng)圖庫(kù)中查看下載的圖片。運(yùn)行Demo在網(wǎng)頁(yè)中對(duì)圖片做長(zhǎng)按點(diǎn)擊即可下載網(wǎng)絡(luò)圖片
直接上代碼:
下面附有Demo下載:點(diǎn)擊打開鏈接
package demo.sam.webview_demo; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import java.io.FileNotFoundException; public class MainActivity extends Activity { private ProgressBar progress; private WebView webView; private EditText editText; private Button click; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context= this; initView(); initData(); initListener(); } private void initData() { WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true);//設(shè)置此屬性,可任意比例縮放 settings.setLoadWithOverviewMode(true); // 使頁(yè)面支持縮放 settings.setBuiltInZoomControls(true); settings.setSupportZoom(true); //支持自動(dòng)加載圖片 settings.setLoadsImagesAutomatically(true); settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);// 排版適應(yīng)屏幕 // 縮放按鈕 settings.setDisplayZoomControls(false); webView.setWebViewClient(new WebViewClient(){ // 頁(yè)面在當(dāng)前頁(yè)面跳轉(zhuǎn) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } // 頁(yè)面加載結(jié)束 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if(progress!=null){ progress.setVisibility(View.GONE); } } }); } private void initView() { progress = (ProgressBar) findViewById(R.id.progress); webView = (WebView) findViewById(R.id.webView); editText = (EditText) findViewById(R.id.url); click = (Button) findViewById(R.id.click); } private void initListener() { // 網(wǎng)頁(yè)加載進(jìn)度顯示 webView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); progress.setVisibility(View.VISIBLE); progress.setProgress(newProgress); } }); click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e("輸入的網(wǎng)站",editText.getText().toString().trim()); webView.loadUrl(editText.getText().toString().trim()); } }); // 長(zhǎng)按點(diǎn)擊事件 webView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { final WebView.HitTestResult hitTestResult = webView.getHitTestResult(); // 如果是圖片類型或者是帶有圖片鏈接的類型 if(hitTestResult.getType()== WebView.HitTestResult.IMAGE_TYPE|| hitTestResult.getType()== WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){ // 彈出保存圖片的對(duì)話框 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("提示"); builder.setMessage("保存圖片到本地"); builder.setPositiveButton("確認(rèn)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { String url = hitTestResult.getExtra(); // 下載圖片到本地 DownPicUtil.downPic(url, new DownPicUtil.DownFinishListener(){ @Override public void getDownPath(String s) { Toast.makeText(context,"下載完成",Toast.LENGTH_LONG).show(); Message msg = Message.obtain(); msg.obj=s; handler.sendMessage(msg); } }); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { // 自動(dòng)dismiss @Override public void onClick(DialogInterface dialogInterface, int i) { } }); AlertDialog dialog = builder.create(); dialog.show(); } return true; } }); webView.loadUrl("http://www.baidu.com"); } Handler handler =new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); String picFile = (String) msg.obj; String[] split = picFile.split("/"); String fileName = split[split.length-1]; try { MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), picFile, fileName, null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知圖庫(kù)更新 getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + picFile))); Toast.makeText(context,"圖片保存圖庫(kù)成功",Toast.LENGTH_LONG).show(); } }; // 監(jiān)聽返回鍵返回網(wǎng)頁(yè)的上一層 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){ if(webView != null){ webView.goBack(); return true; } } return super.onKeyDown(keyCode, event); } }
圖片下載的工具類
import android.os.AsyncTask; import android.os.Environment; import android.util.Log; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Random; /** * 圖片下載的工具類 */ public class DownPicUtil { /** *下載圖片,返回圖片的地址 * @param url */ public static void downPic(String url,DownFinishListener downFinishListener){ // 獲取存儲(chǔ)卡的目錄 String filePath = Environment.getExternalStorageDirectory().getPath(); File file = new File(filePath+File.separator+"webViewCache"); if(!file.exists()){ file.mkdir(); } loadPic(file.getPath(),url,downFinishListener); } private static void loadPic(final String filePath, final String url, final DownFinishListener downFinishListener) { Log.e("下載圖片的url",url); new AsyncTask<Void,Void,String>(){ String fileName; InputStream is; OutputStream out; @Override protected String doInBackground(Void... voids) { // 下載文件的名稱 String[] split = url.split("/"); String newString = split[split.length - 1]; fileName =newString.substring(newString.length()-20,newString.length()-1) ; // 創(chuàng)建目標(biāo)文件,不是文件夾 File picFile = new File(filePath + File.separator + fileName); if(picFile.exists()){ return picFile.getPath(); } try { URL picUrl = new URL(url); //通過(guò)圖片的鏈接打開輸入流 is = picUrl.openStream(); if(is==null){ return null; } out = new FileOutputStream(picFile); byte[] b=new byte[1024]; int end ; while ((end=is.read(b))!=-1){ out.write(b,0,end); } Log.e("OK??","----------"); if(is!=null){ is.close(); } if(out!=null){ out.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return picFile.getPath(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if(s!=null){ downFinishListener.getDownPath(s); } } }.execute(); } //下載完成回調(diào)的接口 public interface DownFinishListener{ void getDownPath(String s); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 自定義View手寫簽名并保存圖片功能
- Android WebView實(shí)現(xiàn)長(zhǎng)按保存圖片及長(zhǎng)按識(shí)別二維碼功能
- Android 保存WebView中的圖片示例
- Android長(zhǎng)按imageview把圖片保存到本地的實(shí)例代碼
- Android實(shí)現(xiàn)點(diǎn)擊WebView界面中圖片滑動(dòng)瀏覽與保存圖片功能
- Android 實(shí)現(xiàn)WebView點(diǎn)擊圖片查看大圖列表及圖片保存功能
- Android實(shí)現(xiàn)將View轉(zhuǎn)化為圖片并保存到本地
相關(guān)文章
Android模擬開關(guān)按鈕點(diǎn)擊打開動(dòng)畫(屬性動(dòng)畫之平移動(dòng)畫)
這篇文章主要介紹了Android模擬開關(guān)按鈕點(diǎn)擊打開動(dòng)畫(屬性動(dòng)畫之平移動(dòng)畫)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09android RecyclerView添加footerview詳解
大家好,本篇文章主要講的是android RecyclerView添加footerview詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01android 6.0 寫入SD卡的權(quán)限申請(qǐng)實(shí)例講解
今天小編就為大家分享一篇android 6.0 寫入SD卡的權(quán)限申請(qǐng)實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Android手機(jī)注冊(cè)登錄時(shí)獲取驗(yàn)證碼之后倒計(jì)時(shí)功能(知識(shí)點(diǎn)總結(jié))
這篇文章主要介紹了Android手機(jī)注冊(cè)登錄時(shí)獲取驗(yàn)證碼之后倒計(jì)時(shí)(知識(shí)點(diǎn)總結(jié))功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-01-01Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄實(shí)例詳解
沉浸式狀態(tài)欄是指狀態(tài)欄與ActionBar顏色相匹配,隱藏導(dǎo)航欄,就是將導(dǎo)航欄隱藏,去掉下面的黑條。下面通過(guò)實(shí)例給大家詳解android沉浸式狀態(tài)欄與隱藏導(dǎo)航欄,感興趣的朋友一起看看2017-07-07Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù)的操作方法
這篇文章主要介紹了Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù),本次也是介紹了用另外一種方法來(lái)實(shí)現(xiàn)RecyclerView高效刷新數(shù)據(jù)的功能,需要的朋友可以參考下2022-10-10Android PopupWindow全屏詳細(xì)介紹及實(shí)例代碼
這篇文章主要介紹了 Android PopupWindow全屏詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12Android使用android-wheel實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android使用android-wheel實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android Okhttp斷點(diǎn)續(xù)傳面試深入解析
這篇文章主要給大家介紹了關(guān)于Android Okhttp斷點(diǎn)續(xù)傳面試的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06