Hi, Replying to my own email hoping it will help somebody not to waist time.
The issue was related to Android-6 and above file treatment permissions. It is well covered by the excellent link below: http://www.bytran.org/androidmpermissions.htm IMHO, I would believe that it could be explained in Qt-documentation for Android-Extras - note for the maintainer. Thanks. Kind regards, Robert On Thu, Mar 23, 2017 at 7:23 PM, Robert Iakobashvili <corobe...@gmail.com> wrote: > Hello, > > Qt-5.7, Nexus-7, Android-6, API 25 or 22. > > 1. Running Intent from Qt widget app to ask for a new file rather in a > standard way works properly: > > QAndroidJniObject intent("android/content/Intent"); > QAndroidJniObject ACTION_CREATE_DOCUMENT = > QAndroidJniObject::fromString("android.intent.action.CREATE_DOCUMENT"); > > if (ACTION_CREATE_DOCUMENT.isValid() && intent.isValid()) > { > intent.callObjectMethod("setAction", > > "(Ljava/lang/String;)Landroid/content/Intent;", > ACTION_CREATE_DOCUMENT.object<jstring>()); > intent.callObjectMethod("setType", > > "(Ljava/lang/String;)Landroid/content/Intent;", > > QAndroidJniObject::fromString("text/html").object<jstring>()); > intent.callObjectMethod("putExtra", > > "(Ljava/lang/String;Z)Landroid/content/Intent;", > > QAndroidJniObject::fromString("android.intent.extra.LOCAL_ONLY").object<jstring>(), > jboolean(true)); > QtAndroid::startActivity(intent.object<jobject>(), > > AndroidOpenFileReceiver::NEW_FILE_NAME_REQUEST, > this->android_receiver_); > } > > 2. File could be selected and seen as immediately created in a > derivative of a QAndroidActivityResultReceiver > > handleActivityResult > > const QString fileURI = > data.callObjectMethod("getData","()Landroid/net/Uri;").toString(); > > and that could be translated by calling Java to the absolute file path > for the file selected, i.e. first.htm: > > /storage/emulated/0/Download/first.htm > > 3. The file content could be written or read in Java using Java I/O Streams. > Further the stream and file are closed in Java. > > 4. Unfortunately, returning to C++ the file is found existing, but open fails. > That happens in all cases consistently: whenever dealing with it in > Java before or not. > > if (!QFile::exists(filename)) - it exists > return false; > > QFile file(filename); > if (!file.open(QFile::ReadWrite)) - fails > { > if (!file.open(QFile::ReadOnly)) - fails. > return false; > } > > 5. The C++ code above works fine if the location of the files is in > /data/data/<app-path> > or any writable standard path returned by Qt. > > 6. My conclusion is that on Nexus-7 the Intent returned path in > /storage/emulated/0/Download/ > is considered to be an External Storage. > > But the manifest has appropriate Write and Read permissions for > External Storage. > > The question is what I am missing like > permission for that specific thread or running something on the GUI > thread, or etc. > > Thanks in advance for any help or ideas. > > Kind regards, > Robert _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest