alex_lip
alex_lip4 июня 2018 г. 8:58

Открыть файл из своего приложения - приложением по умолчанию под андроид 7

Открываю файл из своего приложения так -

            QDesktopServices::openUrl(QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/temp_esd/file."+file_ext));
проверял на младших версиях андроид - работает. Сейчас проверяю на Galaxy tab2 - android 7 - пишет -

D libQuickEsd.so: (null):0 ((null)): path : "/storage/emulated/0/Documents/temp_esd/file.docx"

D libQuickEsd.so: (null):0 ((null)): Downloading is completed

W System.err: android.os.FileUriExposedException: file:///storage/emulated/0/temp_esd/file.docx exposed beyond app through Intent.getData()

W System.err: at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)

W System.err: at android.net.Uri.checkFileUriExposed(Uri.java:2346)

Видимо какие-то разрешения нужны. В тотал командере открывает приложением по умолчанию. А с моего приложения - нет. Где-то какие то пермиссии проверять?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

15
Evgenii Legotckoi
  • 4 июня 2018 г. 9:08

Забавно, у Java разработчиков тоже что-то подобное вываливается на Android 7.


Из советов рекомендуют заменить начало uri с file:// на content://

А также покрутить manifest для file provider`a

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <application
        ...
        <provider
            android:name=".GenericFileProvider"
            android:authorities="${applicationId}.my.package.name.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
</manifest>
Ну и создать этот xml для provider_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>
Но что-то мне кажется, что может хватить и просто смены начала URI в случае с Qt.
    a
    • 4 июня 2018 г. 12:34

    Это вроде из-за targetSdk


    Вот такой вариант с targetSdkVersion 26 (у меня работал, но я не вникал что к чему)

      <provider android:name="android.support.v4.content.FileProvider" android:authorities="<к примеру имя пакета>.fileprovider" android:exported="false" android:grantUriPermissions="true">
    
                <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
            </provider>
    
    создать file_paths.xml

    и в build.gradle в dependencies указать:
    compile "com.android.support:support-core-utils:27.1.0"
    compile "com.android.support:appcompat-v7:27.1.0"


      alex_lip
      • 5 июня 2018 г. 3:21
      Жестко ругается
       
      на вариант от ant87 пишет
       
      E AndroidRuntime: FATAL EXCEPTION: main
      E AndroidRuntime: Process: org.adm.esd, PID: 8470
      E AndroidRuntime: java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/org.adm.esd-2/base.apk"],nativeLibraryDirectories=[/data/app/org.adm.esd-2/lib/arm, /data/app/org.adm.esd-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
      правда у меня не получилось компильнуть с зависимостями
      compile 'com.android.support:support-core-utils:27.1.0'
      compile 'com.android.support:appcompat-v7:27.1.0'
      ругается
      A problem occurred evaluating root project 'android-build'.

      > Could not find method compile() for arguments [com.android.support:support-core-utils:27.1.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

       

      Вариант с

      .GenericFileProvider
      
      тоже не прокатывает приложение запускается и вываливается с ошибкой
       
      E AndroidRuntime: FATAL EXCEPTION: main

      E AndroidRuntime: Process: org.adm.esd, PID: 11116

      E AndroidRuntime: java.lang.RuntimeException: Unable to get provider org.adm.esd.GenericFileProvider: java.lang.ClassNotFoundException: Didn't find class "org.adm.esd.GenericFileProvider" on path: DexPathList[[zip file "/data/app/org.adm.esd-2/base.apk"],nativeLibraryDirectories=[/data/app/org.adm.esd-2/lib/arm, /data/app/org.adm.esd-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]

        alex_lip
        • 5 июня 2018 г. 3:25
        вот мой манифест


        <provider android:name=".GenericFileProvider" android:authorities="${applicationId}.org.adm.esd.provider" android:exported="false" android:grantUriPermissions="true">
                    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
                </provider>
        



          alex_lip
          • 5 июня 2018 г. 4:04
          • (ред.)
          А как заменить начало uri с file:// на content:// ?
          Я же не вручную пишу file:/// - это пишет QUrl::fromLocalFile
            Evgenii Legotckoi
            • 5 июня 2018 г. 4:12
            QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation).toString().replace("file://", "content://")
              alex_lip
              • 5 июня 2018 г. 4:45
              нет - не обманешь ))
              W System.err: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=content:///storage/emulated/0/temp_esd/file.pdf cmp=com.google.android.gm/.browse.TrampolineActivity launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } } from ProcessRecord{7633793 19246:org.adm.esd/u0a155} (pid=19246, uid=10155) requires com.google.android.gm.permission.READ_GMAIL
                Evgenii Legotckoi
                • 5 июня 2018 г. 5:20

                Вообще здесь конкретно написано, какие разрешения нужны

                requires com.google.android.gm.permission.READ_GMAIL
                Попробуйте подправить манифест
                <user-permission android :name="com.google.android.gm.permission.WRITE_GMAIL">
                <user-permission android :name="com.google.android.gm.permission.AUTO_SEND">
                  alex_lip
                  • 5 июня 2018 г. 6:04
                  • (ред.)

                  непонятно причем тут Gmail ? Я открываю pdf или docx приложением по умолчанию для pdf или docx.

                  (написал вот так - <uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL"> - пишет несоответствие tag mistmach    <user-permission android:name="com.google.android.gm.permission.WRITE_GMAIL"> - то же самое

                  Надо все-таки с файл провайдером разбираться..

                    Evgenii Legotckoi
                    • 5 июня 2018 г. 6:05
                    • (ред.)

                    Тоже понятия не имею, у вас в ошибке написано


                    W System.err: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=content:///storage/emulated/0/temp_esd/file.pdf cmp=com.google.android.gm/.browse.TrampolineActivity launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } } from ProcessRecord{7633793 19246:org.adm.esd/u0a155} (pid=19246, uid=10155) requires com.google.android.gm.permission.READ_GMAIL
                      a
                      • 5 июня 2018 г. 7:39

                      этот вариант работал на всех устройствах (от Android 4.1 до 8.0), на которых я пробовал(пробовал на эмуляторах), но я записывал и считывал данные из своей папки, которая создавалась при установке программы:


                      manifest:
                      <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.fileprovider" android:exported="false" android:grantUriPermissions="true">
                      
                                  <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
                              </provider>
                      В папке папке res создай папку xml и добавь туда file_paths.xml. Добавь res в проект в android

                      file_paths.xml
                      <?xml version="1.0" encoding="utf-8"?>
                      <paths>
                          <external-files-path name="my_folder" path="folder"/>
                      </paths>
                      

                      При запуске программы автоматически создастся каталог com.example/files/
                      Я пробовал вариант с чтением и записью файла только по этому пути (а не вообще любого файла)

                      Потом
                      QString c_pathFolder = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
                      c_pathFolder += "/Android/data/com.example/files/folder/"
                      QDir t_dir;
                      t_dir.mkpath(c_pathFolder);
                      c_pathFolder += "text.txt";
                      QFile t_file(c_pathFolder);
                      t_file.open.....
                      
                      Без этого
                      compile "com.android.support:support-core-utils:27.1.0"
                      приложение при запуске завершалось с ошибкой
                        alex_lip
                        • 5 июня 2018 г. 10:32
                        По идее у Вас это не должно было работать. Дело в том, что fileprovider не просто меняет file:/// на content:/// , но и добавляет авторизацию и доступ к отдельной папке через

                        // Using FileProvider you must get the URI from FileProvider using your AUTHORITY
                        // Uri uri = Uri.fromFile(imageFileToShare);
                        Uri uri;
                        try {
                        uri = FileProvider.getUriForFile(QtNative.activity(), AUTHORITY, imageFileToShare);
                        }

                        и сам fileprovider добавлен в версии 22.1.0 - а это андроид 5.1
                        Как-то все запутанно....



                          a
                          • 5 июня 2018 г. 12:45
                          • (ред.)

                          я проверял только создание/чтение/запись файлов только моим тестовым приложением, другие варианты я не пробовал. Т.е. файлы находящиеся в каталоге com.example/files/folder/ я мог своим тестовым приложением создавать/открывать/удалять вне зависимости от targetSdkVersion.

                            alex_lip
                            • 8 июня 2018 г. 7:35
                            Судя по всему только вставка на яве может помочь - вот документация в которой подробно описаны все пять этапов https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri


                              alex_lip
                              • 8 июня 2018 г. 7:35
                              Судя по всему только вставка на яве может помочь - вот документация в которой подробно описаны все пять этапов https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri


                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                AD

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:50баллов,
                                • Очки рейтинга-4
                                m
                                • molni99
                                • 26 октября 2024 г. 1:37

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:80баллов,
                                • Очки рейтинга4
                                m
                                • molni99
                                • 26 октября 2024 г. 1:29

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Результат:20баллов,
                                • Очки рейтинга-10
                                Последние комментарии
                                i
                                innorwall14 ноября 2024 г. 19:03
                                Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                                i
                                innorwall14 ноября 2024 г. 11:42
                                Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                i
                                innorwall14 ноября 2024 г. 9:09
                                Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                                i
                                innorwall14 ноября 2024 г. 4:05
                                EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                                Сейчас обсуждают на форуме
                                i
                                innorwall14 ноября 2024 г. 3:39
                                добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                i
                                innorwall11 ноября 2024 г. 10:55
                                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                9
                                9Anonim25 октября 2024 г. 9:10
                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                ИМ
                                Игорь Максимов3 октября 2024 г. 4:05
                                Реализация навигации по разделам Спасибо Евгений!

                                Следите за нами в социальных сетях