Android 호출 시스템 내부 다운로드 프로그램 다운로드 파일 (1)

5892 단어 Android
원문:http://blog.csdn.net/whyrjj3/article/details/8000740
 
안 드 로 이 드 2.3 이전에 시스템 내부 의 다운로드 프로그램 을 호출 하여 다운로드 하려 면 직접 호출 할 수 없습니다. 브 라 우 저 를 통 해 만 호출 할 수 있 습 니 다. 다음 과 같 습 니 다.
 
Uri uri = Uri.parse(fileUrl);
Intent downloadIntent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(downloadIntent);

이렇게 하면 시스템 의 파일 을 직접 호출 하여 다운로드 할 수 있 습 니 다. 그러면 좋 은 점 이 있 습 니 다. 바로 현재 응용 프로그램 은 권한 을 설명 하지 않 아 도 물건 을 다운로드 할 수 있 기 때문에 네트워크 에 접근 할 수 있 는 권한 이 없 는 응용 프로그램 이 아니 라 네트워크 에 직접 접근 할 수 없다 고 할 수 있 습 니 다.
다운로드 한 파일 은 / mnt / sdcard / download 디 렉 터 리 아래 에 저 장 됩 니 다.현재 휴대 전화의 sdcard 를 사용 할 수 없다 면 다운로드 에 실패 할 수 있 지만, sdcard 를 사용 할 수 있 을 때 만 이 작업 을 계속 다운로드 할 수 있 습 니 다.
여기에 통제 하기 어 려 운 부분 이 있 습 니 다. 바로 파일 을 다운로드 한 후에 언제 다운로드 가 완 료 될 지 모 릅 니 다. 언제 다운로드 가 완 료 될 지 알 고 싶 으 면 sd 카드 위의 그 파일 의 크기 가 다운로드 한 url 이 방문 한 content - length 와 같 는 지 모니터링 해 야 합 니 다.
본문 주소:http://blog.csdn.net/whyrjj3/article/details/8000740
안 드 로 이 드 2.3 이후 시스템 은 내부 다운로드 프로그램 을 열 었 다.DownloadManager 같은 종 류 를 사용 할 수 있 게 되 었 습 니 다.사용 방법 은 다음 과 같다.
 
    DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
		
	Uri uri = Uri.parse("fileUrl");
	Request request = new Request(uri);

	//           ,        wifi     
	request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);  

	//      ,     ,                :android.permission.DOWNLOAD_WITHOUT_NOTIFICATION  
	//request.setShowRunningNotification(false);  

	//         
	request.setVisibleInDownloadsUi(false);
        /*            ,  sdcard   ,         ,         sdcard  ,               /mnt/sdcard/Android/data/packageName/files    ,  sdcard   ,          ,   ,       /cache        */
//request.setDestinationInExternalFilesDir(this, null, "tar.apk");
long id = downloadManager.enqueue(request);
//TODO  id   ,        ,     Preferences  

이 때 프로그램 은 최소한 두 개의 권한 을 설명해 야 합 니 다.
  
    

이 방법 을 사용 하면 사용자 가 다운로드 과정 을 제어 할 수 있다. 즉, 다운로드 가 끝나 지 않 고 다운로드 하고 싶 지 않 으 면 다운 로드 를 중지 할 수 있 고 라디오 수신 자 를 등록 할 수 있 으 며 파일 을 다운로드 하면 라디오 를 받 을 수 있다.그리고 다운로드 한 파일 의 경 로 를 얻 을 수 있 습 니 다:
package cn.dotcreate.testProcess;

import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.widget.Toast;

public class CompleteReceiver extends BroadcastReceiver {

	private DownloadManager downloadManager;

	@Override
	public void onReceive(Context context, Intent intent) {
		
		String action = intent.getAction();
		if(action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
			Toast.makeText(context, "     ....", Toast.LENGTH_LONG).show();
			
			long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);                                                                                      //TODO     id    id    ,                  
			Query query = new Query();
			query.setFilterById(id);
			downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
			Cursor cursor = downloadManager.query(query);
			
			int columnCount = cursor.getColumnCount();
			String path = null;                                                                                                                                       //TODO             ,     ,     ,         path
			while(cursor.moveToNext()) {
				for (int j = 0; j < columnCount; j++) {
					String columnName = cursor.getColumnName(j);
					String string = cursor.getString(j);
					if(columnName.equals("local_uri")) {
						path = string;
					}
					if(string != null) {
						System.out.println(columnName+": "+ string);
					}else {
						System.out.println(columnName+": null");
					}
				}
			}
			cursor.close();
		//  sdcard           ,                ,      ,                                                              if(path.startsWith("content:")) {
                               cursor = context.getContentResolver().query(Uri.parse(path), null, null, null, null);
                               columnCount = cursor.getColumnCount();
                               while(cursor.moveToNext()) {
                                    for (int j = 0; j < columnCount; j++) {
                                                String columnName = cursor.getColumnName(j);
                                                String string = cursor.getString(j);
                                                if(string != null) {
                                                     System.out.println(columnName+": "+ string);
						}else {
							System.out.println(columnName+": null");
						}
					}
				}
				cursor.close();
			}
			
		}else if(action.equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) {
			Toast.makeText(context, "     ....", Toast.LENGTH_LONG).show();
		}
	}
}

목록 에 현재 이 receiver 를 등록 합 니 다:

            
                
                
            
        

    설명 할 것 은 핸드폰 의 sdcard 가 사용 가능 하 다 면 위의 path 는 sdcard 위의 경로 입 니 다. sdcard 가 사용 되 지 않 으 면 그 경 로 는 콘 텐 츠 제공 자의 경로 입 니 다.

좋은 웹페이지 즐겨찾기