Java 将大文件从SD卡复制到android上的内部内存

Java 将大文件从SD卡复制到android上的内部内存,java,android,android-permissions,file-permissions,android-sdcard,Java,Android,Android Permissions,File Permissions,Android Sdcard,我是Android新手,我想复制一个由用户选择的大约2GB的大文件,所以我想默认情况下它应该对内部内存有权限。我已经在AndroidManifest中添加了权限,但我不知道如何以及是否需要使用Android。我还想知道这个过程是如何在另一个线程上发生的,这样应用程序在这个过程中就不会被阻塞,并且可以显示进度 您可以使用前台服务来执行此操作,并确保进程不会中断 构建服务: 公共类CopyService扩展服务{ @凌驾 创建时的公共无效{ } @凌驾 公共int ONSTARTCOMMAND最终意

我是Android新手,我想复制一个由用户选择的大约2GB的大文件,所以我想默认情况下它应该对内部内存有权限。我已经在AndroidManifest中添加了权限,但我不知道如何以及是否需要使用Android。我还想知道这个过程是如何在另一个线程上发生的,这样应用程序在这个过程中就不会被阻塞,并且可以显示进度

您可以使用前台服务来执行此操作,并确保进程不会中断

构建服务:

公共类CopyService扩展服务{ @凌驾 创建时的公共无效{ } @凌驾 公共int ONSTARTCOMMAND最终意图、int标志、int startId{ //在这里运行移动代码 返回开始时间不粘; } } 重要的是,您要将其作为前台服务启动,并在清单中添加权限,这样它就不会在一段时间后被销毁。然后,您需要添加一个通知,以便用于进度

进一步阅读服务:

正如@blackapps指出的,检查权限并仅在获得授权的情况下启动服务是明智的决定。我通常检查许可是否被授予,如果没有,我请求它,如果它是我遵循的。然后我再次检查它,以便查看用户是否授予了它

谷歌有一篇关于如何申请权限的好文章:

但是如何移动文件?以下是我在自己的应用程序中使用的代码:

私有静态void moveFileFile from,File to{ 输入流输入流; 输出流输出流; 试一试{ inputStream=新文件InputStreamFrom; outputStream=新文件OutputStreamTo; 字节[]缓冲区=新字节[1024]; 当inputStream.readbuffer>0时{ outputStream.writebuffer; } inputStream.close; outputStream.close; //如果要保留原始文件,您可能不希望这样做 from.delete; Log.iLOG_标记,文件复制成功; }捕捉异常{ e、 打印跟踪; } //在这里停止服务 }
要在服务中运行的代码应该放在onStartCommand中

您不需要使用文件提供程序,复制小文件或大文件的代码是相同的。清单中的请求权限是不够的。您应该为运行时权限添加代码。不是所有的。。。取决于路径。代码片段会有所帮助:什么的代码片段?目标是经典文件路径。因此,复制是在一个循环中,从拾取的uri上的inputstream读取字节,然后将字节写入FileOutputStream。我从未在copyDocument中尝试过这种情况。因此,我可以查看用户是否授予了它。如果没有,我会用stopSelf停止服务;您不应该在拥有权限之前启动服务。这可能是一个更好的解决方案。我没想过。要更新我的答案吗