Download Manager 시스템 자체 다운로드 클래스 Jetpack

17502 단어 android
1. / / 다운로드 시 알림 표시 줄 을 표시 하지 않 습 니 다.  downRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN); 따라서 AndroidManifest. xml 파일 에 필요 한 권한 을 추가 하면 됩 니 다.
둘, 9.0 http 사이트 에 접근 하면 추가 하 는 것 을 기억 하 세 요.
android:usesCleartextTraffic="true"

3. 등록 감청 기 ContentObserver (다운 로드 를 실행 하기 전에 콘 텐 츠 감청 자 를 등록 해 야 함) 세 가지 인 자 는 각각 감청 할 Uri, false 가 이 Uri 와 정확하게 일치 하 는 것 을 나타 내 고 true 는 파생 된 Uri, ContentObserver 의 파생 인 스 턴 스 와 일치 할 수 있 음 을 나타 낸다.
1. 기초 (대충 보면 돼 요. 코드 를 보면 어떻게 쓰 는 지 알 수 있어 요)
  • DownloadManager 프로필 DownloadManager 는 Android 2.3 (API level 9) 에서 시스템 서비스 (Service) 방식 으로 장시간 다운로드 작업 을 처리 하 는 DownloadManager 를 제공 했다.두 개의 정적 내부 클래스 DownloadManager. Query (다운로드 정 보 를 조회 하 는 데 사용) 와 DownloadManager. Request (다운로드 요청) 를 포함 합 니 다.DownloadManager 는 주로 다음 과 같은 몇 가지 방법 을 제공 합 니 다. Public long enqueue (Request request) 는 다운로드 대기 열 에 작업 을 추가 하고 다운로드 정 보 를 조회 할 수 있 도록 downloadId 로 돌아 갑 니 다.만약 에 네트워크 가 조건 을 만족 시 키 지 못 하면 Sdcard 마 운 트 중, 최대 병발 수 를 초과 하 는 등 이상 이 다운 로드 를 기다 리 고 정상 적 이면 직접 다운로드 합 니 다.public int remove (long... ids) 는 다운 로드 를 삭제 합 니 다. 다운 로드 를 취소 하면 다운로드 파일 과 기록 을 동시에 삭제 합 니 다.public Cursor query (Query query) 는 다운로드 파일 의 총 크기, 다운로드 한 크기, 다운로드 상태 등 을 포함 하여 다운로드 정 보 를 조회 합 니 다.
  • ContentObserver 소개 Public void ContentObserver (Handler handler) 모든 ContentObserver 의 파생 클래스 는 이 구조 방법 을 호출 해 야 합 니 다. 매개 변수: handler Handler 대상 은 메 인 스 레 드 에서 UI 를 수정 하 는 데 사 용 됩 니 다.public void onChange (boolean selfChange) 에서 관찰 한 Uri 의 내용 이 변 하면 이 방법 을 되 돌려 줍 니 다.모든 ContentObserver 의 파생 클래스 는 이 방법 을 다시 불 러 와 논 리 를 처리 해 야 합 니 다.특정 Uri 를 관찰 하 는 절 차 는 다음 과 같 습 니 다. 1. 우리 의 특정한 ContentObserver 파생 류 를 만 들 려 면 부모 류 구조 방법 을 다시 불 러 와 야 합 니 다. onChange () 방법 을 다시 불 러 와 서 리 셋 후의 기능 을 처리 해 야 합 니 다.2. 지정 한 Uri 에 ContentObserver 파생 클래스 인 스 턴 스 를 등록 하고 주어진 Uri 가 바 뀌 었 을 때 이 인 스 턴 스 대상 을 되 돌려 처리 하 며 registerContentObserver () 방법 으로 내용 관찰 자 를 등록 합 니 다.3. ContentObserver 의 생명주기 가 Activity 와 Service 와 일치 하지 않 기 때 문 입 니 다.따라서 필요 하지 않 을 때 unregister ContentObserver () 로그아웃 내용 관찰 자 를 수 동 으로 호출 해 야 합 니 다.

  • 2. 방송 수신 자 를 통 해 다운로드 상 태 를 감청
    public class DownUtils {
        private DownResultListener downResultListener=null;
        private static final String TAG = "DownUtils";
        //   
        private DownloadManager downloadManager=null;
        //   ID
        private long downloadId=-1;
        private String pathstr="";
        private boolean downingFlag=false;
    
        /**
         *   apk     ,              
         * @param mContext
         * @param url
         * @param downFileName       ,    ,  :myjst.apk
         * @param showInNotify
         * @param notifyTitle
         * @param notifyMsg
         * @param listener
         * @return
         */
        public boolean downloadTask(Context mContext, String url, String downFileName,
                                    boolean showInNotify, String notifyTitle, String notifyMsg, DownResultListener listener) {
            if(downingFlag){
                return false;
            }else{
                downingFlag=true;
            }
            downloadId=-1;
            this.downResultListener=listener;
            //      
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
            //             
            request.setAllowedOverRoaming(false);
            //         
            if(showInNotify){
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            }else{
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
            }
            //        
            //
            //request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
            //             
            request.setTitle(notifyTitle);
            //             
            request.setDescription(notifyMsg);
            request.setVisibleInDownloadsUi(true);
            //   setAllowedNetworkTypes                ,
            //      setAllowedOverRoaming  ,     
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
            //request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
            //     
            //request.setMimeType("application/zip");
            //       
            File file = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), downFileName);
            request.setDestinationUri(Uri.fromFile(file));
            pathstr = file.getAbsolutePath();
            //request.setDestinationInExternalPublicDir("DownloadManagerTest", "myjst.apk");
            //  DownloadManager
            if (downloadManager == null)
                downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
            //           ,                long  id,   id      ,    、         
            if (downloadManager != null) {
                downloadId = downloadManager.enqueue(request);
            }else{
                downingFlag=false;
                return false;
            }
    
            //        ,            
            //apk    ,            ,    application   (  )     
            //       ,     app      。
            //    ,
            // 1、 application   (  )     
            // 2、  apk   id=-1        ,   id==-1,       
            //       ,      
            mContext.registerReceiver(receiver,
                    new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    
            return true;
        }
    
        //           
        private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if(downloadId==-1){
                    return;
                }
                checkStatus(context);
            }
        };
    
        //      
        private void checkStatus(Context context) {
            DownloadManager.Query query = new DownloadManager.Query();
            //     id  
            query.setFilterById(downloadId);
            Cursor cursor = downloadManager.query(query);
            if (cursor.moveToFirst()) {
                int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                switch (status) {
                    //    
                    case DownloadManager.STATUS_PAUSED:
                        Log.e(TAG, "queryUri: STATUS_PAUSED");
                        break;
                    //    
                    case DownloadManager.STATUS_PENDING:
                        Log.e(TAG, "queryUri: STATUS_PENDING");
                        break;
                    //    
                    case DownloadManager.STATUS_RUNNING:
                        Log.e(TAG, "queryUri: STATUS_RUNNING");
                        break;
                    //    
                    case DownloadManager.STATUS_SUCCESSFUL:
                        Log.e(TAG, "queryUri: STATUS_SUCCESSFUL");
                        if(downResultListener!=null){
                            downResultListener.onSuccess(context,pathstr);
                            downResultListener=null;
                        }
                        downloadId=-1;
                        context.unregisterReceiver(receiver);
                        downingFlag=false;
                        break;
                    //    
                    case DownloadManager.STATUS_FAILED:
                        Log.e(TAG, "queryUri: STATUS_FAILED");
                        if(downResultListener!=null){
                            downResultListener.onFail(context,"  ");
                            downResultListener=null;
                        }
                        downloadId=-1;
                        context.unregisterReceiver(receiver);
                        downingFlag=false;
                        break;
                }
            }
            cursor.close();
        }
    
    
        public interface DownResultListener{
            public void onSuccess(Context context,String filePath);
            public void onFail(Context context,String msg);
        }
    
    }
    

    호출 방법:
     new DownUtils().downloadTask(this, PATH, "myjst.apk", true
                    ,"title","msg des` ", new DownUtils.DownResultListener() {
                        @Override
                        public void onSuccess(Context context, String filePath) {
                            Tools.installAPK(context,new File(filePath));
                            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
                        }
    
                        @Override
                        public void onFail(Context context, String msg) {
                            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
                        }
                    });

    3. 실시 간 으로 다운로드 진 도 를 가 져 옵 니 다.(이 demo 는 연습 일 뿐 거 칠 게 썼 으 니 실전 때 스스로 수정 해 야 합 니 다)
    public class DownLoadActivity extends AppCompatActivity {
        private static final String TAG = "MainActivity";
        private static final String PATH = "http://xxx/rch.apk";
        private long mId = -1;
        private DownloadManager mDownloadManager;
        private DownloadManager.Query mQuery;
        private Uri mUri;
        private Handler myHandler=new Handler();
        private DownloadStatusObserver observer = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_down_load);
            //   DownloadManager  
            mDownloadManager = (DownloadManager) this.getSystemService(DOWNLOAD_SERVICE);
            observer = new DownloadStatusObserver(myHandler);
            //             
            registerContentObserver();
        }
    
    
    
        /**
         *     
         */
        public void downLoad(View view) {
            doSuccess=false;
            /*   onCreate
            //   DownloadManager  
            mDownloadManager = (DownloadManager) this.getSystemService(DOWNLOAD_SERVICE);
            observer = new DownloadStatusObserver(myHandler);
            //             
            registerContentObserver();*/
    
            //         
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(PATH));
            //                
            // setDestinationUri
            // setDestinationInExternalPublicDir
            request.setDestinationInExternalPublicDir("DownloadManagerTest", "myjst.apk");
            //             
            request.setTitle("python");
            //             
            request.setDescription("python desc");
            //         
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            //   setAllowedNetworkTypes                ,
            //      setAllowedOverRoaming  ,     
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
            request.setVisibleInDownloadsUi(true);
            //     
            request.setMimeType("application/zip");
    
            //     ,  downloadId,downloadId           。        、Sdcard   、               ,       。
            mId = mDownloadManager.enqueue(request);
            //             
            Long maxBytesOverMobile = DownloadManager.getMaxBytesOverMobile(this);
            Log.e(TAG, "downLoad: maxBytesOverMobile ---------" + maxBytesOverMobile);
            //               
            Long recommendedMaxBytesOverMobile = DownloadManager.getRecommendedMaxBytesOverMobile(this);
            Log.e(TAG, "downLoad: recommendedMaxBytesOverMobile ---------" + recommendedMaxBytesOverMobile);
    
    
        }
    
    
        /**
         *   ContentObserver
         */
        private void registerContentObserver() {
            /** observer download change **/
            if (observer != null) {
                //            Uri、false       Uri,true          Uri、ContentObserver      
                getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, observer);
            }
        }
    
    
        /**
         *       
         */
        public void unDownLoad(View view) {
            //     ,        。            。
            mDownloadManager.remove(mId);
        }
    
        /**
         *       
         */
        public void queryUri(View view) {
            queryDownFileInfo();
        }
    
        private void queryDownFileInfo() {
            //   Uri     
            mUri = mDownloadManager.getUriForDownloadedFile(mId);
           /* if(mUri!=null){
                getContentResolver().unregisterContentObserver(observer);
                getContentResolver().registerContentObserver(mUri, true, observer);
            }*/
            Log.e(TAG, "queryUri: uri--------" + mUri);
            //         
            mQuery = new DownloadManager.Query().setFilterById(mId);
            //               
            Cursor cursor = mDownloadManager.query(mQuery);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    //       
                    String fileUri = cursor.getString(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
                    Log.e(TAG, "queryUri: fileUri ---------" + fileUri);
                    //       
                    int status = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                    Log.e(TAG, "queryUri: " + status);
                    logStatus(status);
                }
                cursor.close();
            }
        }
    
        /**
         *       
         *
         * @param downloadId   ID
         * @return
         */
        public int[] getBytesAndStatus(long downloadId) {
            int[] bytesAndStatus = new int[]{-1, -1, 0};
            DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
            Cursor c = null;
            try {
                c = mDownloadManager.query(query);
                if (c != null && c.moveToFirst()) {
                    //         
                    bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                    //       
                    bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                    //       
                    bytesAndStatus[2] = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
            return bytesAndStatus;
        }
    
        class DownloadStatusObserver extends ContentObserver {
    
            DownloadStatusObserver(Handler handler) {
                super(handler);
            }
    
            @Override
            public void onChange(boolean selfChange) {
                try {
                    if(mId!=-1){
                        int[] bytesAndStatus = getBytesAndStatus(mId);
                        //    
                        int currentSize = bytesAndStatus[0];
                        //   
                        int totalSize = bytesAndStatus[1];
                        //    
                        int status = bytesAndStatus[2];
                        Log.e(TAG, "    =" + currentSize + ",   =" + totalSize + ",status=" + status);
                        /*if(i++>100){
                            Log.e(TAG, "    =" + currentSize + ",   =" + totalSize + ",status=" + status);
                            i=0;
                        }*/
                        //     ,onChange        ,        
                        logStatus(status);
    
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
    
        }
    
        private boolean doSuccess=false;
        private void logStatus(int status) {
            switch (status) {
                //      
                case DownloadManager.STATUS_PENDING:
                    Log.e(TAG, "queryUri: STATUS_PENDING");
                    break;
                //    
                case DownloadManager.STATUS_PAUSED:
                    Log.e(TAG, "queryUri: STATUS_PAUSED");
                    break;
                //     
                case DownloadManager.STATUS_RUNNING:
                    Log.e(TAG, "queryUri: STATUS_RUNNING");
                    break;
                //     
                case DownloadManager.STATUS_SUCCESSFUL:
                    Log.e(TAG, "queryUri: STATUS_SUCCESSFUL");
                    if(!doSuccess){
                        doSuccess=true;
                        queryDownFileInfo();
                    }
    
                    break;
                //     
                case DownloadManager.STATUS_FAILED:
                    Log.e(TAG, "queryUri: STATUS_FAILED");
                    break;
                default:
                    break;
            }
        }
    
    
        @Override
        protected void onResume() {
            super.onResume();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            getContentResolver().unregisterContentObserver(observer);
        }
    
        
    }
    

    xml:
     
    참고 글:
    1. Android DownloadManager 사용 ,버그
    2, DownloadManager 구현 버 전 업데이트, 감청 다운로드 진행

    좋은 웹페이지 즐겨찾기