将大文件从SD卡复制到android的内部存储器中

问题描述 投票:0回答:1

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

java android android-permissions file-permissions android-sdcard
1个回答
0
投票

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

构建服务:

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;
  }
}

重要的是,将其作为前台服务启动(在清单中添加权限),因此一段时间后它不会被销毁。然后,您需要添加一条通知,您可以将其用于进度。

进一步阅读服务: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()中

© www.soinside.com 2019 - 2024. All rights reserved.