Android 以编程方式将文件保存到存储

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

我尝试过以下代码:(以前它工作正常,现在我正在测试它不工作可能是由于安卓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.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>