0

Использование Android 6.0.1, API 23,Документ-подборщика продолжает появляться даже несмотря на сохранение устанавливается (в SAF - Storage Access Framework)

Я успешно реализован чтение файла из хранилища-месте, что пользователь выбирает в сборщике документов SAF (Storage Access Framework).

Теперь я хотел бы использовать Persist permissions, который SAF разрешает, чтобы мое приложение всегда выбирало один и тот же файл (но без какого-либо окна выбора документов [и под-окна], появляющихся все время).

мне как-то удалось реализовать в PERSIST-разрешения (как показано на SAF-doc) (... для этого, см мой пример кода ниже ...) - Но вопросы придумали:

  1. Несмотря работа с правами на постоянство - почему появляется окно выбора документов? После того как файл будет выбран пользователем - с этого момента я хотел бы просто получить содержимое файла без какого-либо окна выбора, выходящего на передний план. Это возможно? И если да, то как? (Я могу сказать, что разрешение на постоянство работает так как файл сразу читается без необходимости повторного выбора пользователя. Но все же это неприятное окно выбора не должно появляться - или делает это?)
  2. Возможно ли, сохранить разрешение SAF настойчивость, даже если мое приложение закрывается или останавливается? Если да, то как?

Вот пример кода, который делает получить содержимое файла, включая моего суда с разрешения инерционности:

Внутри StorageClientFragment Класс:

public String locationFileContent; 

public void performFileSearch() { 
    Intent openDocumentIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    openDocumentIntent.addCategory(Intent.CATEGORY_OPENABLE); 
    openDocumentIntent.setType("text/plain"); 
    openDocumentIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 
           | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
           | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 
    startActivityForResult(openDocumentIntent, READ_REQUEST_CODE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 
     Uri uri = null; 
     if (resultData != null) { 
      uri = resultData.getData(); 

      // Here is my Persist-permission trial !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      getActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      try { 
       this.locationFileContent = readTextFromUri(uri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

private String readTextFromUri(Uri uri) throws IOException { 
    InputStream inputStream = getActivity().getContentResolver().openInputStream(uri); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
    StringBuilder stringBuilder = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     stringBuilder.append(line); 
    } 
    inputStream.close(); 
    return stringBuilder.toString(); 
} 

Создание фрагмента получает сделано в MainActivity:

StorageClientFragment storageClientFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (getSupportFragmentManager().findFragmentByTag(FRAGTAG) == null) { 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     storageClientFragment = new StorageClientFragment(); 
     transaction.add(storageClientFragment, FRAGTAG); 
     transaction.commit(); 
    } 
} 

Вызов FileSearch делается, когда тест-кнопка нажата:

public void TestingButtonClicked(View view) { 
    this.storageClientFragment.performFileSearch(); 
    String stringFileContent = this.storageClientFragment.locationFileContent; 
    Toast.makeText(this, "Back in Main, Content = " + stringFileContent, Toast.LENGTH_SHORT).show(); 
} 

Приведенный выше код работает красиво. Но опять же, как я могу остановить окно выбора документов SAF все время (хотя разрешение на сохранение сохраняется)?

ответ

0

Почему окно выбора документов все время подтягивается?

Предположительно, потому что вы продолжаете начинать деятельность ACTION_OPEN_DOCUMENT. Если вы не хотите, чтобы пользователь запрашивал документ, не начинайте эту операцию.

Хотелось бы просто получить содержимое файла без выбора на переднем плане. Это возможно ? И если да, то как?

Точно так же, что вы получили содержание первоначально: передать Uri к openInputStream() на ContentResolver.

Если вы используете takePersistableUriPermissions() стремиться к долгоживущему доступу к контенту, он по-прежнему ваша работа держаться на Uri.Это не сильно отличается от того, как это работает в других средах (например, помня историю пользователя о локальных путях файлов для настольной ОС).

Поскольку Uri может быть тривиальным преобразовать в и из String, экономя Uri где-то (база данных, SharedPreferences или другой файл) не является особенно трудным.

Возможно ли сохранить разрешение на сохранение SAF, даже если мое приложение закрыто или остановлено? Если да, то как?

takePersistableUriPermission(), как вы уже применили.

+0

Спасибо! Это многое разъясняет. Это все очень ново для меня, и я не знал, что URI уникален и может быть сохранен (например, с SharedPrefs). И если я правильно понял, takePersistableUriPermission() как-то дважды проверяет со скрытым безопасным флагом и сообщает App, что это хорошо (или нет, если пользователь никогда ничего не выбрал в сборщике документов). Довольно приятно - все это. Я попытаюсь реализовать это. Еще раз спасибо ! – iKK