Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. any upto date instructions/cheat sheet to view a pdf on Android from a qt app, ala openurl() but for API 26+
Forum Updated to NodeBB v4.3 + New Features

any upto date instructions/cheat sheet to view a pdf on Android from a qt app, ala openurl() but for API 26+

Scheduled Pinned Locked Moved Solved Mobile and Embedded
3 Posts 1 Posters 476 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • testmonkeyT Offline
    testmonkeyT Offline
    testmonkey
    wrote on last edited by
    #1

    Hello Folks

    Just trying to open a pdf in android after I have saved it to QStandardPaths::standardLocations(QStandardPaths::AppDataLocation)/pdf/

    followed https://www.qt.io/blog/2017/12/01/sharing-files-android-ios-qt-app and grabbed bits out the source for the ACTION_VIEW method.

    Setup fileprovider in the AndroidManifest

    but somethings not working...
    taping/clicking the row in my tableview, downloads the pdf successfully and kicks off the pdf viewer, but its blank.

    WIP code snip from mainwindow.cpp

    TemporaryFile file(QDir::toNativeSeparators("./pdf/suiteQL-XXXXXX.pdf"));
    file.setAutoRemove(false);
    if (file.open()) {
            file.write(QByteArray::fromBase64(b64));
            file.close();
    
            // fails on android :(
            QDesktopServices::openUrl(QUrl("file:///" + file.fileName()));
           
            QUrl tmpUrl  = file.fileName();
            QString tmpStra =  tmpUrl.fileName();
    
            //uggg hard coded for now
            QAndroidJniObject jniPath=QAndroidJniObject::fromString("content://blahSuiteQL.fileprovider/mypdf/" + tmpStra);
            
            QAndroidJniObject jniUri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", jniPath.object<jstring>());
            QAndroidJniObject jniParam = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Intent", "ACTION_VIEW");
            QAndroidJniObject jniIntent("android/content/Intent","(Ljava/lang/String;)V",jniParam.object<jstring>());
            QAndroidJniObject jniType = QAndroidJniObject::fromString("application/pdf");
            QAndroidJniObject jniPermissions = 
            
            //fudged this in, not sure if it's correct.... also tried it without
            QAndroidJniObject::fromString("FLAG_GRANT_READ_URI_PERMISSION");
            QAndroidJniObject jniFlags = jniIntent.callObjectMethod("setFlags", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", jniPermissions.object<jstring>());
            //
    
            QAndroidJniObject jniResult = jniIntent.callObjectMethod("setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", jniUri.object<jobject>(), jniType.object<jstring>());
            QAndroidJniObject activity = QtAndroid::androidActivity();
            QAndroidJniObject packageManager = activity.callObjectMethod("getPackageManager",
                                                                         "()Landroid/content/pm/PackageManager;");
            QAndroidJniObject componentName = jniIntent.callObjectMethod("resolveActivity",
                                                                      "(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;",
                                                                      packageManager.object());
            QtAndroid::startActivity(jniIntent, 0);
            }
    

    snip from AndroidManifest.xml

            <provider android:name="android.support.v4.content.FileProvider"
            android:authorities="blahSuiteQL.fileprovider"
            android:grantUriPermissions="true" android:exported="false">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths"/>
            </provider>
        </application>
    

    res/xml/filepaths.xml

    <paths>
        <files-path path="pdf/" name="mypdf" />
    </paths>
    

    meh stuck, with head ache :(

    Any help or leads would be appreciated.

    Just trying to open a test pdf pulled down and decoded from a netsuite restlet. (POST reply)

    If I put it in QStandardPaths::standardLocations(QStandardPaths::DownloadLocation I can open it in file manager.

    Kind Regards

    Craig

    1 Reply Last reply
    0
    • testmonkeyT Offline
      testmonkeyT Offline
      testmonkey
      wrote on last edited by
      #2

      @testmonkey said in any upto date instructions/cheat sheet to view a pdf on Android from a qt app, ala openurl() but for API 26+:

          //fudged this in, not sure if it's correct.... also tried it without
          QAndroidJniObject jniPermissions = QAndroidJniObject::fromString("FLAG_GRANT_READ_URI_PERMISSION");
          QAndroidJniObject jniFlags = jniIntent.callObjectMethod("setFlags", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", jniPermissions.object<jstring>());
          //
      

      just pasted the comment in the wrong place on original post.

      1 Reply Last reply
      0
      • testmonkeyT Offline
        testmonkeyT Offline
        testmonkey
        wrote on last edited by
        #3

        Hi Folks.... was calling the setFlags wrong.

        this is the code I ended up with and working (tho no error checking atm)

                QAndroidJniObject path=QAndroidJniObject::fromString("content://blahSuiteQL.fileprovider/mypdf/" + tmpStra);
                QAndroidJniObject jniUri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", path.object<jstring>());
                QAndroidJniObject jniParam = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Intent", "ACTION_VIEW");
                QAndroidJniObject intent("android/content/Intent","()V");
                                  intent.callObjectMethod("setAction","(Ljava/lang/String;)Landroid/content/Intent;",jniParam.object<jstring>());
                QAndroidJniObject jniType = QAndroidJniObject::fromString("application/pdf");
                jint jniPermissions =  QAndroidJniObject::getStaticField<jint>("android/content/Intent","FLAG_GRANT_READ_URI_PERMISSION");
                                  intent.callObjectMethod("setFlags", "(I)Landroid/content/Intent;",jniPermissions);
                                  intent.callObjectMethod("setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", jniUri.object<jobject>(), jniType.object<jstring>());
                QAndroidJniObject activity = QtAndroid::androidActivity();
                QAndroidJniObject packageManager = activity.callObjectMethod("getPackageManager","()Landroid/content/pm/PackageManager;");
                                   intent.callObjectMethod("resolveActivity","(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;",packageManager.object());
                QtAndroid::startActivity(intent, 0);
        

        Kind Regards
        Craig

        1 Reply Last reply
        1

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved