1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mahongyin-FitAndroidO

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

FitAndroid7

Одна строка кода позволяет адаптировать Android 7 FileProvider.

Для адаптации FileProvide необходимо объявить provider, написать xml и выполнить адаптацию версии в коде. Можно создать небольшую библиотеку, чтобы упростить эти повторяющиеся операции, избежать повторного объявления provider, написания xml и выполнения адаптации версии в коде... fork от hangyangAndroid. Адаптирован к androidx, добавлен APK для установки AndroidO, права доступа для неизвестного источника.

Использование

compile 'com.mhy.base:fileprovider:1.0.0'

Чтобы получить uri, можно использовать класс FileProvider7. Например:

  • FileProvider7.getUriForFile
  • FileProvider7.setIntentDataAndType
  • FileProvider7.setIntentData

Пример 1: съёмка фото

private static final int REQUEST_CODE_TAKE_PHOTO = 0x110;
private String mCurrentPhotoPath;

public void takePhotoNoCompress(View view) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        String filename = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA)
                .format(new Date()) + ".png";
        File file = new File(Environment.getExternalStorageDirectory(), filename);
        mCurrentPhotoPath = file.getAbsolutePath();
	     // Изменить только эту строку
        Uri fileUri = FileProvider7.getUriForFile(this, file);

        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PHOTO);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_TAKE_PHOTO) {
        mIvPhoto.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));
    }
    // else tip?

}

Пример 2: установка APK

// Проверяет наличие Android O и установку из неизвестного источника
    private static final int INSTALL_PACKAGES_REQUESTCODE = 10011;
    private static final int GET_UNKNOWN_APP_SOURCES = 10012;

    private void checkAndroidO() {// Если есть разрешения на чтение и запись, то проверяет наличие неизвестных приложений
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Система Android O или более поздняя версия
            // Необходимо ли обрабатывать разрешение на установку неизвестного приложения. true означает доверие к установке пакета, false требует авторизации
            boolean canRequestPackageInstalls = getPackageManager().canRequestPackageInstalls();
            if (canRequestPackageInstalls) {
                installApk();
            } else {
                // Запрос на установку разрешений для приложений из неизвестных источников
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);
            }
        } else {  // Прямой процесс установки
            installApk();
        }
    }

public void installApk(View view) {
    File file = new File(Environment.getExternalStorageDirectory(),
            "testandroid7-debug.apk");
    Intent intent = new Intent(Intent.ACTION_VIEW);
    // Изменить только эту строку
    FileProvider7.setIntentDataAndType(this,
            intent, "application/vnd.android.package-archive", file, true);
    startActivity(intent);
}

В Android Q по-прежнему используются READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE как разрешения, связанные с хранением данных, но даже при наличии этих разрешений невозможно прочитать внешнее хранилище.

Общедоступные каталоги: Downloads, Documents, Pictures, DCIM, Movies, Music, Ringtones и т. д.

Данные приложений не удаляются после удаления приложения из общедоступных каталогов. Приложения могут получать доступ к файлам в этих каталогах через SAF (System Access Framework) или интерфейс MediaStore. Каталоги, специфичные для приложения Данные приложения удаляются после удаления приложения. Частные каталоги приложения, приложение может получить доступ к своим собственным каталогам без каких-либо разрешений. Android Q определяет два вида хранилищ: Legacy View (традиционное представление) и Filtered View (отфильтрованное представление).

Filtered View (отфильтрованный вид) Приложение может напрямую обращаться к своему собственному каталогу, но не может напрямую обращаться к внешнему каталогу своего собственного каталога, обращаться к общедоступному каталогу или другому приложению, которое должно проходить через MediaStore, SAF (сокращение от System Access Framework), или другой контекст, предоставленный приложением, FileProvider и т.д. Legacy View (традиционный вид) На Android Q приложения с target SDK больше или равным 29 будут по умолчанию получать Filtered View, а приложения с меньшим значением получат Legacy View. Это означает, что приложения с меньшим target SDK совместимы с предыдущими версиями, а приложения с большим target SDK могут получить доступ только через определённые методы. В AndroidManifest.xml можно установить новый атрибут requestLegacyExternalStorage, чтобы изменить модель представления внешнего хранилища, где true — это Legacy View, а false — Filtered View.

Кроме того, в Android Q были внесены изменения в операции запроса, чтения и записи файлов, например, географическое местоположение изображений больше не предоставляется по умолчанию, данные, полученные через MediaProvider, ненадёжны, и был введён статус ожидания для файлов. Кроме того, при доступе к файлу каталог данных больше не используется, и вместо этого следует использовать MediaStore или SAF для получения Uri файла, а затем использовать Uri для открытия FD или ввода-вывода потока. Не следует сравнивать файлы, используя каталог данных.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Одной строкой кода адаптирован FileProvider для Android 7. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mahongyin-FitAndroidO.git
git@api.gitlife.ru:oschina-mirror/mahongyin-FitAndroidO.git
oschina-mirror
mahongyin-FitAndroidO
mahongyin-FitAndroidO
master