Скопируйте большой файл с SD-карты во внутреннюю память на Android - PullRequest
0 голосов
/ 26 октября 2019

Я новичок в Android и хочу скопировать во внутреннюю память большой файл (около 2 ГБ) , выбранный пользователем (так что я предполагаю, что у него должны быть разрешения по умолчанию). У меня уже есть разрешения, добавленные в AndroidManifest, но я не знаю, как (и если мне нужно) использовать Android FileProivder . Я также хотел бы знать, как этот процесс может происходить в другом потоке, чтобы приложение не блокировалось во время процесса, и оно может показать прогресс.

1 Ответ

1 голос
/ 26 октября 2019

Для этого вы можете использовать службу переднего плана и убедиться, что процесс не прерывается.

Создайте службу:

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 ()

...