안 드 로 이 드 웹 뷰 를 통 해 APK 다운로드 요청

6139 단어 기록 하 다.
웹 뷰 의 구체 적 인 사용 을 연구 하지 않 습 니 다.프로젝트 에서 만 났 을 때 H5 의 단 추 를 누 르 면 APK 를 다운로드 합 니 다.방금 이 요 구 를 받 고 생각 한 첫 번 째 아 이 디 어 는 JS 를 호출 하 는 것 이다.그리고 실제로 사용 하기 전에 WebView 를 보 러 간 API 를 발 견 했 습 니 다. 웹 뷰 다음 거 있어 요. setDownloadListener 방법.웹 뷰 를 사용 할 때 자원 을 다운로드 해 야 할 때 주로 사용 합 니 다.APK 다운로드 방법:
다운 로 더 다운로드 도구:
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.support.v4.content.FileProvider;
import android.widget.Toast;

import java.io.File;

/**
 * Created by 49829 on 2017/8/28.
 */

public class Downloader {
    //   
    private DownloadManager downloadManager;
    //   
    private Context mContext;
    //   ID
    private long downloadId;

    public Downloader(Context context) {
        this.mContext = context;
    }

    //  apk
    public void downloadAPK(String url, String name) {

        //      
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        //             
        request.setAllowedOverRoaming(false);

        //       ,       
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle("    ");
        request.setDescription("    ...");
        request.setVisibleInDownloadsUi(true);

        //       
        request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath(), name);

        //  DownloadManager
        downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
        //           ,                long  id,   id      ,    、         
        downloadId = downloadManager.enqueue(request);

        //       ,      
        mContext.registerReceiver(receiver,
                new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

    //           
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            checkStatus();
        }
    };


    //      
    private void checkStatus() {
        DownloadManager.Query query = new DownloadManager.Query();
        //     id  
        query.setFilterById(downloadId);
        Cursor c = downloadManager.query(query);
        if (c.moveToFirst()) {
            int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
            switch (status) {
                //    
                case DownloadManager.STATUS_PAUSED:
                    break;
                //    
                case DownloadManager.STATUS_PENDING:
                    break;
                //    
                case DownloadManager.STATUS_RUNNING:
                    break;
                //    
                case DownloadManager.STATUS_SUCCESSFUL:
                    //      APK
                    installAPK();
                    break;
                //    
                case DownloadManager.STATUS_FAILED:
                    Toast.makeText(mContext, "    ", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    //          
    private void installAPK() {

        Intent intent = new Intent();
        File apkFile = queryDownloadedApk();
        Uri uri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0    
    //com.xxx.xxx.fileprovider   manifest provider     ;apkFile   1      apk  
uri = FileProvider.getUriForFile(mContext, "com.zz.fileprovider", apkFile);
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0 이후 시스템 은 임시 uri 읽 기 권한 을 부여 해 야 합 니 다.설치 가 완료 되면 시스템 은 자동 으로 권한 을 회수 하고 다음 과정 은 사용자 의 상호작용 이 없습니다.
}else{/7.0 이하 시작 자세
uri = Uri.fromFile(apkFile);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
public File queryDownloadedApk() {
File targetApkFile = null;
if (downloadId != -1) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);
Cursor cur = downloadManager.query(query);
if (cur != null) {
if (cur.moveToFirst()) {
String uriString = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
if (!uriString.isEmpty()) {
targetApkFile = new File(Uri.parse(uriString).getPath());
}
}
cur.close();
}
}
return targetApkFile;
}
}
바로 WebView 에서 의 다운로드 감청 중 사용:
   webView.setDownloadListener(new DownloadListener() {
                            @Override
                            public void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        //           、       
                                        if (ContextCompat.checkSelfPermission(RechargeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                                            ActivityCompat.requestPermissions(RechargeActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE2);
                                        } else {
                                            downloadAPK.downloadAPK(url,"***.apk");//DownLoader    oncreate     
                                        }
                                    }
                                });


                            }
                        });

좋은 웹페이지 즐겨찾기