用户授权写的权限下载文件
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity" ;
private final int CODE1 = 1 ;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View view) {
if (Build.VERSION.SDK_INT > 22 ) {
if (ContextCompat.checkSelfPermission(MainActivity.this , Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this , Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(MainActivity.this , "用户已拒绝" , Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE1);
}
} else {
download();
}
}
}
});
}
/**
* 用户选择允许或拒绝后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
*/
@Override
public void onRequestPermissionsResult (int requestCode, @NonNull String[] permissions, @NonNull int [] grantResults) {
super .onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case CODE1:
if (grantResults[0 ] == PackageManager.PERMISSION_GRANTED) {
download();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this , Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this , "用户已拒绝" , Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(this , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE1);
}
}
break ;
}
}
/**
* 下载文件
*/
private void download () {
Log.d(TAG, "download: 开始下载+++++++++++++++" );
Retrofit build = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(Constants.BASE_URL)
.build();
ApiService apiService = build.create(ApiService.class);
apiService.download().subscribeOn(Schedulers.io()).observeOn(Schedulers.io())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept (ResponseBody responseBody) throws Exception {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory() + File.separator + "master/" ;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
File dirFile = new File(file, "download.apk" );
if (!dirFile.exists()) {
dirFile.createNewFile();
}
InputStream inputStream = responseBody.byteStream();
FileOutputStream fileOutputStream = new FileOutputStream(dirFile);
int length = 0 ;
byte [] bytes = new byte [2048 ];
while ((length = inputStream.read(bytes)) != -1 ) {
Log.d(TAG, "download: ===" +length);
fileOutputStream.write(bytes, 0 , length);
fileOutputStream.flush();
}
Log.d(TAG, "download: 下载完毕+++++++++++++++" );
fileOutputStream.close();
inputStream.close();
}
}
}, new Consumer<Throwable>() {
@Override
public void accept (Throwable throwable) throws Exception {
}
});
}
}
public interface ApiService {
@GET ("version/file.apk" )
@Streaming
Observable<ResponseBody> download();
}
public class Constants {
public static final String BASE_URL = "https://www.zhaoapi.cn/" ;
}