java - 在 Android 上将大文件从 SD 卡复制到内部存储器

标签 java android android-permissions file-permissions android-sdcard

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

最佳答案

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

构建服务:

public class CopyService extends Service {
  @Override
  public void onCreate() {

  }

  @Override
  public int onStartCommand(final Intent intent, int flags, int startId) {
    // Run the moving code here
    return START_NOT_STICKY;
  }
}

将其作为前台服务启动(在 list 中添加权限)非常重要,这样它就不会在一段时间后被破坏。然后您需要添加一条通知,您可以使用该通知来取得进展。

进一步了解服务:https://developer.android.com/guide/components/services

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

Google 有一篇关于如何请求权限的精彩文章: https://developer.android.com/training/permissions/requesting

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

private static void moveFile(File from, File to) {
  InputStream inputStream;
  OutputStream outputStream;

  try {
    inputStream = new FileInputStream(from);
    outputStream = new FileOutputStream(to);

    byte[] buffer = new byte[1024];

    while (inputStream.read(buffer) > 0) {
      outputStream.write(buffer);
    }

    inputStream.close();
    outputStream.close();

    // You may wish not to do this if you want to keep the original file
    from.delete();

    Log.i(LOG_TAG, "File copied successfully");

  } catch (IOException e) {
    e.printStackTrace();
  }

  // Stop service here
}

您想要在服务内运行的代码应放置在 onStartCommand() 内

关于java - 在 Android 上将大文件从 SD 卡复制到内部存储器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573901/

相关文章:

java - 具有多个条件的 for 循环的大 O

java - 如何检查用户是否第一次使用我的应用程序

java - API key 配置android

java - 何时使用权限 WRITE_CONTACT 和 READ_CONTACT?

java - 如何在 Struts 2 optgroup 中显示 Map 值的元素(对象列表)?

java - 线程中的异常 "main"java.lang.NoSuchMethodError : com. google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;)

java - 使用 Selenium、TestNG、java 的 Arraylist 推送动态表行

android - Alert Builder 只在第一次调用?

android - 谷歌地图如何在安卓设备离线的情况下获取地址

android - 检查哪些代码使用权限