diff --git a/android/androidfiledialog.cpp b/android/androidfiledialog.cpp index 94fbc0b1a581b3e04b62ed2e4f13243ad9f9be1f..140a19163c922b9e2bbc13e88db9f98ccbe37524 100755 --- a/android/androidfiledialog.cpp +++ b/android/androidfiledialog.cpp @@ -40,15 +40,25 @@ void AndroidFileDialog::ResultReceiver::handleActivityResult( int receiverReques QString AndroidFileDialog::ResultReceiver::uriToPath( const QAndroidJniObject &uri ) { QAndroidJniEnvironment env; - + QString path = uri.callObjectMethod( "getPath", "()Ljava/lang/String;" ).toString(); if ( uri.toString().startsWith( "file:", Qt::CaseInsensitive ) ) { return uri.callObjectMethod( "getPath", "()Ljava/lang/String;" ).toString(); } - + QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/osalliance/rocketchatMobile/MainActivity", + "uriToData", + "(Ljava/lang/String;)[B", QAndroidJniObject::fromString(uri.toString()).object<jstring>()); + qDebug() << "opening uri "<<uri.toString(); QAndroidJniObject contentResolver = QtAndroid::androidActivity().callObjectMethod( "getContentResolver", "()Landroid/content/ContentResolver;" ); QAndroidJniObject cursor = contentResolver.callObjectMethod( "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;", uri.object<jobject>(), 0, 0, 0, 0 ); - QAndroidJniObject DATA = QAndroidJniObject::fromString( "_data" ); + QAndroidJniObject DATA = QAndroidJniObject::fromString( "_display_name" ); jint columnIndex = cursor.callMethod<jint>( "getColumnIndexOrThrow", "(Ljava/lang/String;)I", DATA.object<jstring>() ); + jbyteArray dataArray = data.object<jbyteArray>(); + jsize iconSize = env->GetArrayLength(dataArray); + jbyte *realdata = env->GetByteArrayElements(dataArray, JNI_FALSE); + QString cache = QStandardPaths::writableLocation( QStandardPaths::TempLocation ); + QDir cacheDir(cache); + QUuid id = QUuid::createUuid(); + if ( env->ExceptionCheck() ) { qWarning() << "Fileupload: JAVA exception: "; @@ -59,9 +69,18 @@ QString AndroidFileDialog::ResultReceiver::uriToPath( const QAndroidJniObject &u cursor.callMethod<jboolean>( "moveToFirst", "()Z" ); QAndroidJniObject result = cursor.callObjectMethod( "getString", "(I)Ljava/lang/String;", columnIndex ); - - return result.isValid() ? result.toString() : QString( "null" ); - + QString displayName = result.isValid() ? result.toString() : QString( "null" ); + QString cacheFile = cacheDir.filePath(displayName); + qDebug() <<"cachefile: " << cacheFile; + QFile file(cacheFile); + if(realdata != nullptr){ + if(file.open(QIODevice::WriteOnly)){ + file.write((const char*)realdata,iconSize); + } + qDebug() <<"wrote file " << cacheFile; + return cacheFile; + } + return QString( "null" ); } AndroidFileDialog::AndroidFileDialog( QObject *parent ) : QObject( parent ) diff --git a/android/androidfiledialog.h b/android/androidfiledialog.h index f1ae0c91b69f8a61e63db7d84ac931950aefc16d..dd5a322dc6dc29a1f0c7e5feb1440b274edfcffb 100755 --- a/android/androidfiledialog.h +++ b/android/androidfiledialog.h @@ -26,6 +26,9 @@ #include <QtAndroid> #include <QAndroidActivityResultReceiver> #include <QAndroidJniEnvironment> +#include <QStandardPaths> +#include <QDir> +#include <QUuid> class AndroidFileDialog : public QObject {