FitAndroid7
Одна строка кода позволяет адаптировать Android 7 FileProvider.
Для адаптации FileProvide необходимо объявить provider, написать xml и выполнить адаптацию версии в коде. Можно создать небольшую библиотеку, чтобы упростить эти повторяющиеся операции, избежать повторного объявления provider, написания xml и выполнения адаптации версии в коде... fork от hangyangAndroid. Адаптирован к androidx, добавлен APK для установки AndroidO, права доступа для неизвестного источника.
compile 'com.mhy.base:fileprovider:1.0.0'
Чтобы получить uri, можно использовать класс FileProvider7. Например:
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?
}
// Проверяет наличие 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 )