Android 정지점 다운로드 및 자동 으로 설 치 된 예제 코드
위 에는 다운로드 중인 그림 과 다운로드 후 자동 으로 설 치 된 그림 을 알려 줍 니 다.두말 하지 않 고 코드 를 연결 하 세 요!
먼저 다음 포석 을 드 리 겠 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="zhangtao.bwie.com.continutransform.MainActivity">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="22sp"
android:text=""
android:id="@+id/pro_text"
android:layout_below="@id/progress"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/start_btn"
android:text=" "
android:layout_below="@id/pro_text"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/stop_btn"
android:text=" "
android:layout_below="@id/start_btn"
/>
</RelativeLayout>
레이아웃 은 마음대로 쓰 세 요.당신 이 원 하 는 레이아웃 이 라면.그리고 우리 가 쓸 다운로드 도구 류 의 데 이 터 를 전송 하 는 데 사용 할 인 터 페 이 스 를 제공 합 니 다.
package Download;
public interface DownloadListener {
void startDownload();
void stopDownload();
void finishDownload();
void downloadProgress(long progress);
}
이 인 터 페 이 스 는 다운로드 시작,다운로드 정지,다운로드 완료,다운로드 완료 등 4 개의 인터페이스 방법 을 썼 다.다음은 다운로드 도구 류 를 쓰 겠 습 니 다.다운 로드 는 OkHttp 를 사용 하여 네트워크 데 이 터 를 요청 합 니 다.이 도구 류 를 단리 모드 로 써 서 사용 하기에 편리 합 니 다!
package Download;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class DownloadUtils {
private static volatile DownloadUtils instance;
private final OkHttpClient client;
private DownloadListener mlistener;
private File file;
private String fileAbsolutePath;
public File downloadFile;
private long startPosition;
private Call call;
public DownloadUtils() {
client = new OkHttpClient();
}
public void setListener(DownloadListener listener) {
this.mlistener = listener;
}
/**
*
* @return
*/
public void initDownload(String path) {
file = new File(path);
if(!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
if(!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
fileAbsolutePath = file.getAbsolutePath();
Log.d("zzz",fileAbsolutePath.toString());
}
public static DownloadUtils getInstance() {
if(instance == null) {
synchronized (DownloadUtils.class) {
if(instance == null) {
instance = new DownloadUtils();
}
}
}
return instance;
}
public void startDownload(String url) {
if(TextUtils.isEmpty(url)) {
return ;
}
if(url.contains(".")) {
String typename = url.substring(url.lastIndexOf(".") + 1);
if(url.contains("/")) {
String filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
String fn = filename+"."+typename;
downloadFile = new File(this.file, fn);
Log.d("zzz","downloadFile"+downloadFile.toString());
}
}
startPosition = 0;
if(downloadFile.exists()) {
startPosition = downloadFile.length();
}
final Request request = new Request.Builder()
.addHeader("RANGE","bytes="+startPosition+"-")
.url(url)
.build();
call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
mlistener.startDownload();
ResponseBody body = response.body();
// startPosition
long totalLength = body.contentLength() ;
Log.d("zzz", "totalLength: " + totalLength + "----");
InputStream is = body.byteStream();
byte[] bytes = new byte[2048];
int len = 0;
long totalNum = startPosition;
RandomAccessFile raf = new RandomAccessFile(downloadFile, "rw");
while ((len = is.read(bytes,0,bytes.length)) != -1) {
raf.seek(totalNum);
raf.write(bytes,0,len);
totalNum +=len;
mlistener.downloadProgress(totalNum * 100 / totalLength);
}
mlistener.finishDownload();
body.close();
}
});
}
public void stopDownload() {
mlistener.startDownload();
if(call != null && call.isExecuted()) {
call.cancel();
}
}
}
여기 서 정지점 다운 로드 를 하 는 것 은 RandomAccessFile 을 사용 한 것 입 니 다.인터넷 에서 RandomAccessFile 의 역할 을 알 아 보 실 수 있 습 니 다.다음은 메 인 인터페이스의 기능 실현 과 호출 입 니 다.기본적으로 컨트롤 을 가 져 오고 방금 작성 한 도구 류 를 호출 하 는 것 입 니 다.
package zhangtao.bwie.com.continutransform;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.File;
import Download.DownloadListener;
import Download.DownloadUtils;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView pro_text;
private Button start_btn;
private Button stop_btn;
private String downloadUrl = "http://d.988wan.com/zft/qmzft32_988wan_01.apk";
private String path = "/ZhangTao/";
private ProgressBar pro_bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setOnClick();
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File storageDirectory = Environment.getExternalStorageDirectory();
final String absolutePath = storageDirectory.getAbsolutePath();
path = absolutePath + path;
DownloadUtils.getInstance().initDownload(path);
DownloadUtils.getInstance().setListener(new DownloadListener() {
@Override
public void startDownload() {
}
@Override
public void stopDownload() {
}
@Override
public void finishDownload() {
File downloadFile = DownloadUtils.getInstance().downloadFile;
installApk(downloadFile);
}
@Override
public void downloadProgress(final long progress) {
runOnUiThread(new Runnable() {
@Override
public void run() {
pro_bar.setProgress((int) progress);
pro_text.setText(progress+"%");
}
});
}
});
}
}
private void initView() {
pro_text = (TextView) findViewById(R.id.pro_text);
start_btn = (Button) findViewById(R.id.start_btn);
stop_btn = (Button) findViewById(R.id.stop_btn);
pro_bar = (ProgressBar) findViewById(R.id.progress);
}
private void setOnClick() {
start_btn.setOnClickListener(this);
stop_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.start_btn:
DownloadUtils.getInstance().startDownload(downloadUrl);
break;
case R.id.stop_btn:
DownloadUtils.getInstance().stopDownload();
break;
}
}
/**
* apk
* @param file
*/
private void installApk(File file) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
}
}
위의 자동 설 치 는 installApk 라 는 방법 입 니 다.이 방법 은 너무 많이 알 필요 가 없습니다.모두 Android 의 고정 적 인 방법 입 니 다.보통 인터넷 에 있 습 니 다.여러분 을 도 울 수 있 기 를 바 랍 니 다!이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.