Android 以编程方式将文件保存到存储
我尝试过以下代码:(以前它工作正常,现在我正在测试它不工作可能是由于安卓10或其他一些错误)Android 以编程方式将文件保存到存储,android,android-storage,Android,Android Storage,我尝试过以下代码:(以前它工作正常,现在我正在测试它不工作可能是由于安卓10或其他一些错误) 导入android.os.Bundle; 导入android.support.design.widget.FloatingActionButton; 导入android.support.design.widget.Snackbar; 导入android.support.v7.app.AppActivity; 导入android.support.v7.widget.Toolbar; 导入android.v
导入android.os.Bundle;
导入android.support.design.widget.FloatingActionButton;
导入android.support.design.widget.Snackbar;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.Toolbar;
导入android.view.view;
导入android.view.WindowManager;
关于活动的公共类{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u about\u us);
Toolbar Toolbar=findviewbyd(R.id.Toolbar);
设置支持操作栏(工具栏);
新建下载文件()。执行(“https://4.img-dpreview.com/files/p/E~TS590x0~articles/3925134721/0266554465.jpeg);
}
私有类下载文件扩展异步任务{
private PowerManager.WakeLock mWakeLock;
@凌驾
受保护的字符串背景(字符串…字符串){
String fileUrl=strings[0];
字符串extStorageDirectory=Environment.getExternalStorageDirectory().toString();
文件夹=新文件(extStorageDirectory,“MyFolder”);
folder.mkdir();
File pdfFile=新文件(文件夹、文件URL);
试一试{
pdfFile.createNewFile();
}捕获(IOE异常){
e、 printStackTrace();
}
下载文件(fileUrl,pdfFile);
返回null;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//如果用户
//下载时按下电源按钮
PowerManager pm=(PowerManager)context.getSystemService(context.POWER\u服务);
mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
getClass().getName());
mWakeLock.acquire();
mProgressDialog.show();
}
@凌驾
受保护的void onProgressUpdate(整数…进度){
super.onProgressUpdate(进度);
//如果我们到了这里,长度是已知的,现在将undeterminate设置为false
mProgressDialog.setUndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgress(progress[0]);
}
@凌驾
受保护的void onPostExecute(字符串结果){
mWakeLock.release();
mProgressDialog.disclose();
如果(结果!=null)
Toast.makeText(上下文,“下载错误:+result,Toast.LENGTH_LONG).show();
否则{
Toast.makeText(上下文,“下载文件”,Toast.LENGTH_SHORT).show();
activity.startActivity(activity.getIntent());
activity.finish();
}
}
}
公共静态类文件下载程序{
专用静态最终整数兆字节=1024*1024;
公共静态void下载文件(字符串文件URL,文件目录){
试一试{
URL URL=新URL(文件URL);
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream InputStream=urlConnection.getInputStream();
FileOutputStream FileOutputStream=新的FileOutputStream(目录);
int totalSize=urlConnection.getContentLength();
字节[]缓冲区=新字节[MB];
int bufferLength=0;
而((bufferLength=inputStream.read(buffer))>0){
写入(缓冲区,0,缓冲区长度);
}
fileOutputStream.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
我已尝试使用上述代码。
我添加了WRITE_INTERNAL_存储,还请求运行时权限在Android 10上访问文件的方式有了重大变化 看 您需要使用MediaStore或Storage Access Framework(SAF),这是应用程序专用目录以外文件的详细信息 当您存储照片时,MediaStore将是访问照片的方式 虽然作为一个快速的解决办法是暂时选择退出,但这只会在Android 11之前起作用
在您的
AndroidManifest
文件中重新查询了一些更好的Android 10示例Android:requestLegacyExternalStorage=“true”
检查这个
您现在遇到了什么样的错误?无法将文件保存到存储器…这是否回答了您的问题?我的意思是,在保存文件时,logcat上是否出现任何错误?不,我没有收到任何错误消息。考虑到这个解决方案在未来的Android 11中将不起作用。
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.WindowManager;
public class AboutUs extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about_us);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
new DownloadFile().execute("https://4.img-dpreview.com/files/p/E~TS590x0~articles/3925134721/0266554465.jpeg");
}
private class DownloadFile extends AsyncTask<String,Integer, String> {
private PowerManager.WakeLock mWakeLock;
@Override
protected String doInBackground(String... strings) {
String fileUrl = strings[0];
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "MyFolder");
folder.mkdir();
File pdfFile = new File(folder, fileUrl);
try{
pdfFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// take CPU lock to prevent CPU from going off if the user
// presses the power button during download
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
getClass().getName());
mWakeLock.acquire();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
// if we get here, length is known, now set indeterminate to false
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) {
mWakeLock.release();
mProgressDialog.dismiss();
if (result != null)
Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
else {
Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
activity.startActivity(activity.getIntent());
activity.finish();
}
}
}
public static class FileDownloader {
private static final int MEGABYTE = 1024 * 1024;
public static void downloadFile(String fileUrl, File directory){
try {
URL url = new URL(fileUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(directory);
int totalSize = urlConnection.getContentLength();
byte[] buffer = new byte[MEGABYTE];
int bufferLength = 0;
while((bufferLength = inputStream.read(buffer))>0 ){
fileOutputStream.write(buffer, 0, bufferLength);
}
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.xxx.xxxx">
<application
android:requestLegacyExternalStorage="true">
</application>
</manifest>