Added code for receive multiple shared data

This commit is contained in:
FalsinSoft 2020-02-24 13:54:54 +01:00
parent e6d0187db5
commit 699d39d528
7 changed files with 205 additions and 119 deletions

View File

@ -44,7 +44,7 @@ QAndroidSharing::QAndroidSharing() : m_JavaSharing("com/falsinsoft/qtandroidtool
JniEnv->DeleteLocalRef(ObjectClass);
}
CheckSharingRequest();
CheckReceivedSharingRequest();
}
QObject* QAndroidSharing::qmlInstance(QQmlEngine *engine, QJSEngine *scriptEngine)
@ -60,28 +60,28 @@ QAndroidSharing* QAndroidSharing::instance()
return m_pInstance;
}
QAndroidSharing::ACTION_ID QAndroidSharing::getAction() const
QAndroidSharing::ACTION_ID QAndroidSharing::getReceivedSharingAction() const
{
return m_Action;
return m_ReceivedSharingAction;
}
QString QAndroidSharing::getMimeType() const
QString QAndroidSharing::getReceivedSharingMimeType() const
{
return m_MimeType;
return m_ReceivedSharingMimeType;
}
void QAndroidSharing::CheckSharingRequest()
void QAndroidSharing::CheckReceivedSharingRequest()
{
if(m_JavaSharing.isValid())
{
QAndroidJniObject MimeTypeObj;
m_Action = static_cast<ACTION_ID>(m_JavaSharing.callMethod<jint>("getAction", "()I"));
m_ReceivedSharingAction = static_cast<ACTION_ID>(m_JavaSharing.callMethod<jint>("getReceivedSharingAction", "()I"));
MimeTypeObj = m_JavaSharing.callObjectMethod("getMimeType", "()Ljava/lang/String;");
MimeTypeObj = m_JavaSharing.callObjectMethod("getReceivedSharingMimeType", "()Ljava/lang/String;");
if(MimeTypeObj.isValid())
{
m_MimeType = MimeTypeObj.toString();
m_ReceivedSharingMimeType = MimeTypeObj.toString();
}
}
}
@ -99,11 +99,11 @@ bool QAndroidSharing::shareText(const QString &Text)
return false;
}
bool QAndroidSharing::shareData(const QString &MimeType, const QString &DataFilePath)
bool QAndroidSharing::shareBinaryData(const QString &MimeType, const QString &DataFilePath)
{
if(m_JavaSharing.isValid())
{
return m_JavaSharing.callMethod<jboolean>("shareData",
return m_JavaSharing.callMethod<jboolean>("shareBinaryData",
"(Ljava/lang/String;Ljava/lang/String;)Z",
QAndroidJniObject::fromString(MimeType).object<jstring>(),
QAndroidJniObject::fromString(DataFilePath).object<jstring>()
@ -113,13 +113,13 @@ bool QAndroidSharing::shareData(const QString &MimeType, const QString &DataFile
return false;
}
QString QAndroidSharing::getSharedText()
QString QAndroidSharing::getReceivedSharedText()
{
QString SharedText;
if(m_JavaSharing.isValid())
{
const QAndroidJniObject SharedTextObj = m_JavaSharing.callObjectMethod("getSharedText", "()Ljava/lang/String;");
const QAndroidJniObject SharedTextObj = m_JavaSharing.callObjectMethod("getReceivedSharedText", "()Ljava/lang/String;");
if(SharedTextObj.isValid())
{
@ -130,13 +130,13 @@ QString QAndroidSharing::getSharedText()
return SharedText;
}
QByteArray QAndroidSharing::getSharedData()
QByteArray QAndroidSharing::getReceivedSharedBinaryData()
{
QByteArray SharedData;
if(m_JavaSharing.isValid())
{
const QAndroidJniObject SharedDataObj = m_JavaSharing.callObjectMethod("getSharedData", "()[B");
const QAndroidJniObject SharedDataObj = m_JavaSharing.callObjectMethod("getReceivedSharedBinaryData", "()[B");
if(SharedDataObj.isValid())
{
@ -147,6 +147,31 @@ QByteArray QAndroidSharing::getSharedData()
return SharedData;
}
QVariantList QAndroidSharing::getReceivedMultipleSharedBinaryData()
{
QVariantList MultipleSharedData;
if(m_JavaSharing.isValid())
{
const QAndroidJniObject MultipleSharedDataObj = m_JavaSharing.callObjectMethod("getReceivedMultipleSharedBinaryData", "()[[B");
if(MultipleSharedDataObj.isValid())
{
const jobjectArray DataArray = MultipleSharedDataObj.object<jobjectArray>();
QAndroidJniEnvironment pEnv;
int ArraySize;
ArraySize = pEnv->GetArrayLength(DataArray);
for(int i = 0; i < ArraySize; i++)
{
MultipleSharedData << ConvertByteArray(QAndroidJniObject(pEnv->GetObjectArrayElement(DataArray, i)));
}
}
}
return MultipleSharedData;
}
bool QAndroidSharing::requestSharedFile(const QString &MimeType)
{
if(m_JavaSharing.isValid())
@ -165,36 +190,44 @@ bool QAndroidSharing::requestSharedFile(const QString &MimeType)
return false;
}
QByteArray QAndroidSharing::getRequestedSharedFile()
bool QAndroidSharing::saveRequestedSharedFile(const QString &FilePath)
{
QByteArray SharedFileData;
if(m_JavaSharing.isValid())
{
const QAndroidJniObject SharedFileDataObj = m_JavaSharing.callObjectMethod("getRequestedSharedFile", "()[B");
if(SharedFileDataObj.isValid())
{
SharedFileData = ConvertByteArray(SharedFileDataObj);
const QByteArray SharedFileData = ConvertByteArray(SharedFileDataObj);
QFile SharedFile(FilePath);
if(SharedFile.open(QIODevice::WriteOnly) == true)
{
if(SharedFile.write(SharedFileData) == SharedFileData.size())
{
return true;
}
SharedFile.remove();
}
}
}
return SharedFileData;
return false;
}
void QAndroidSharing::closeSharedFile()
void QAndroidSharing::closeRequestedSharedFile()
{
if(m_JavaSharing.isValid())
{
m_JavaSharing.callMethod<void>("closeSharedFile");
m_JavaSharing.callMethod<void>("closeRequestedSharedFile");
}
}
bool QAndroidSharing::returnSharedFile(bool FileAvailable, const QString &MimeType, const QString &FilePath)
bool QAndroidSharing::shareFile(bool FileAvailable, const QString &MimeType, const QString &FilePath)
{
if(m_JavaSharing.isValid())
{
return m_JavaSharing.callMethod<jboolean>("returnSharedFile",
return m_JavaSharing.callMethod<jboolean>("shareFile",
"(ZLjava/lang/String;Ljava/lang/String;)Z",
FileAvailable,
QAndroidJniObject::fromString(MimeType).object<jstring>(),
@ -238,7 +271,7 @@ void QAndroidSharing::RequestedSharedFileInfo(JNIEnv *env, jobject thiz, jstring
if(m_pInstance != nullptr)
{
emit m_pInstance->requestedSharedFileReadyToGet(QAndroidJniObject(mimeType).toString(), QAndroidJniObject(name).toString(), size);
emit m_pInstance->requestedSharedFileReadyToSave(QAndroidJniObject(mimeType).toString(), QAndroidJniObject(name).toString(), size);
}
}

View File

@ -28,8 +28,8 @@
class QAndroidSharing : public QObject, public QAndroidActivityResultReceiver
{
Q_PROPERTY(ACTION_ID action READ getAction CONSTANT)
Q_PROPERTY(QString mimeType READ getMimeType CONSTANT)
Q_PROPERTY(ACTION_ID receivedSharingAction READ getReceivedSharingAction CONSTANT)
Q_PROPERTY(QString receivedSharingMimeType READ getReceivedSharingMimeType CONSTANT)
Q_DISABLE_COPY(QAndroidSharing)
Q_ENUMS(ACTION_ID)
Q_OBJECT
@ -50,32 +50,33 @@ public:
static QAndroidSharing* instance();
Q_INVOKABLE bool shareText(const QString &Text);
Q_INVOKABLE bool shareData(const QString &MimeType, const QString &DataFilePath);
Q_INVOKABLE QString getSharedText();
Q_INVOKABLE QByteArray getSharedData();
Q_INVOKABLE bool shareBinaryData(const QString &MimeType, const QString &DataFilePath);
Q_INVOKABLE QString getReceivedSharedText();
Q_INVOKABLE QByteArray getReceivedSharedBinaryData();
Q_INVOKABLE QVariantList getReceivedMultipleSharedBinaryData();
Q_INVOKABLE bool requestSharedFile(const QString &MimeType);
Q_INVOKABLE QByteArray getRequestedSharedFile();
Q_INVOKABLE void closeSharedFile();
Q_INVOKABLE bool returnSharedFile(bool FileAvailable, const QString &MimeType = QString(), const QString &FilePath = QString());
Q_INVOKABLE bool saveRequestedSharedFile(const QString &FilePath);
Q_INVOKABLE void closeRequestedSharedFile();
Q_INVOKABLE bool shareFile(bool FileAvailable, const QString &MimeType = QString(), const QString &FilePath = QString());
ACTION_ID getAction() const;
QString getMimeType() const;
ACTION_ID getReceivedSharingAction() const;
QString getReceivedSharingMimeType() const;
signals:
void requestedSharedFileReadyToGet(const QString &mimeType, const QString &name, long size);
void requestedSharedFileReadyToSave(const QString &mimeType, const QString &name, long size);
void requestedSharedFileNotAvailable();
private:
const QAndroidJniObject m_JavaSharing;
static QAndroidSharing *m_pInstance;
const int m_SharedFileRequestId = 9002;
ACTION_ID m_Action = ACTION_NONE;
QString m_MimeType;
ACTION_ID m_ReceivedSharingAction = ACTION_NONE;
QString m_ReceivedSharingMimeType;
void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) override;
static void RequestedSharedFileInfo(JNIEnv *env, jobject thiz, jstring mimeType, jstring name, jlong size);
inline QByteArray ConvertByteArray(const QAndroidJniObject &JavaByteArray);
void CheckSharingRequest();
void CheckReceivedSharingRequest();
};

View File

@ -112,6 +112,35 @@ bool QtAndroidTools::removeImage(const QString &Name)
return (m_PhotoMap.remove(Name) > 0) ? true : false;
}
bool QtAndroidTools::binaryDataToFile(const QByteArray &BinaryData, const QString &FilePath)
{
QFile BinaryFile(FilePath);
if(BinaryFile.open(QIODevice::WriteOnly) == true)
{
if(BinaryFile.write(BinaryData) == BinaryData.size())
{
return true;
}
BinaryFile.remove();
}
return false;
}
QByteArray QtAndroidTools::fileToBinaryData(const QString &FilePath)
{
QFile BinaryFile(FilePath);
QByteArray BinaryData;
if(BinaryFile.open(QIODevice::ReadOnly) == true)
{
BinaryData = BinaryFile.readAll();
}
return BinaryData;
}
void QtAndroidTools::InitializeQmlTools()
{
qmlRegisterSingletonType<QtAndroidTools>("QtAndroidTools", 1, 0, "QtAndroidTools", &QtAndroidTools::qmlInstance);

View File

@ -71,6 +71,8 @@ public:
Q_INVOKABLE bool insertImage(const QString &Name, const QByteArray &Data);
Q_INVOKABLE bool removeImage(const QString &Name);
Q_INVOKABLE bool binaryDataToFile(const QByteArray &BinaryData, const QString &FilePath);
Q_INVOKABLE QByteArray fileToBinaryData(const QString &FilePath);
private:
static QtAndroidTools *m_pInstance;

View File

@ -45,23 +45,22 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileDescriptor;
import java.util.ArrayList;
public class AndroidSharing
{
private static final String TAG = "AndroidSharing";
private final Activity mActivityInstance;
private final Intent mActivityIntent;
private ParcelFileDescriptor mInputSharedFile = null;
private ParcelFileDescriptor mRequestedSharedFile = null;
public AndroidSharing(Activity ActivityInstance)
{
mActivityInstance = ActivityInstance;
mActivityIntent = ActivityInstance.getIntent();
}
public int getAction()
public int getReceivedSharingAction()
{
final String ActionValue = mActivityIntent.getAction();
final String ActionValue = mActivityInstance.getIntent().getAction();
int ActionId = ACTION_NONE;
if(ActionValue != null)
@ -83,43 +82,78 @@ public class AndroidSharing
return ActionId;
}
public String getMimeType()
public String getReceivedSharingMimeType()
{
return mActivityIntent.getType();
return mActivityInstance.getIntent().getType();
}
public String getSharedText()
public String getReceivedSharedText()
{
return mActivityIntent.getStringExtra(Intent.EXTRA_TEXT);
return mActivityInstance.getIntent().getStringExtra(Intent.EXTRA_TEXT);
}
public byte[] getSharedData()
public byte[] getReceivedSharedBinaryData()
{
final Uri DataUri = (Uri)mActivityIntent.getParcelableExtra(Intent.EXTRA_STREAM);
final Uri DataUri = (Uri) mActivityInstance.getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
byte[] ByteArray = null;
InputStream DataStream;
try
if(DataUri != null)
{
DataStream = mActivityInstance.getContentResolver().openInputStream(DataUri);
ByteArray = new byte[DataStream.available()];
DataStream.read(ByteArray);
}
catch(FileNotFoundException e)
{
return null;
}
catch(IOException e)
{
return null;
try
{
final InputStream DataStream = mActivityInstance.getContentResolver().openInputStream(DataUri);
ByteArray = new byte[DataStream.available()];
DataStream.read(ByteArray);
}
catch(FileNotFoundException e)
{
return null;
}
catch(IOException e)
{
return null;
}
}
return ByteArray;
}
public byte[][] getReceivedMultipleSharedBinaryData()
{
final ArrayList<Uri> UriArray = mActivityInstance.getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
byte[][] MultipleByteArray = null;
if(UriArray != null)
{
final int UriNum = UriArray.size();
MultipleByteArray = new byte[UriNum][];
for(int i = 0; i < UriNum; i++)
{
try
{
final InputStream DataStream = mActivityInstance.getContentResolver().openInputStream(UriArray.get(i));
MultipleByteArray[i] = new byte[DataStream.available()];
DataStream.read(MultipleByteArray[i]);
}
catch(FileNotFoundException e)
{
return null;
}
catch(IOException e)
{
return null;
}
}
}
return MultipleByteArray;
}
public boolean shareText(String Text)
{
Intent SendIntent = new Intent();
final Intent SendIntent = new Intent();
SendIntent.setAction(Intent.ACTION_SEND);
SendIntent.putExtra(Intent.EXTRA_TEXT, Text);
@ -129,10 +163,10 @@ public class AndroidSharing
return true;
}
public boolean shareData(String MimeType, String DataFilePath)
public boolean shareBinaryData(String MimeType, String DataFilePath)
{
final String PackageName = mActivityInstance.getApplicationContext().getPackageName();
Intent SendIntent = new Intent();
final Intent SendIntent = new Intent();
Uri FileUri;
try
@ -157,10 +191,10 @@ public class AndroidSharing
return true;
}
public boolean returnSharedFile(boolean FileAvailable, String MimeType, String FilePath)
public boolean shareFile(boolean FileAvailable, String MimeType, String FilePath)
{
final String PackageName = mActivityInstance.getApplicationContext().getPackageName();
Intent ReturnIntent = new Intent(PackageName + ".ACTION_RETURN_FILE");
final Intent ReturnFileIntent = new Intent(PackageName + ".ACTION_RETURN_FILE");
if(FileAvailable == true)
{
@ -179,14 +213,14 @@ public class AndroidSharing
return false;
}
ReturnIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ReturnIntent.setDataAndType(FileUri, MimeType);
mActivityInstance.setResult(Activity.RESULT_OK, ReturnIntent);
ReturnFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ReturnFileIntent.setDataAndType(FileUri, MimeType);
mActivityInstance.setResult(Activity.RESULT_OK, ReturnFileIntent);
}
else
{
ReturnIntent.setDataAndType(null, "");
mActivityInstance.setResult(Activity.RESULT_CANCELED, ReturnIntent);
ReturnFileIntent.setDataAndType(null, "");
mActivityInstance.setResult(Activity.RESULT_CANCELED, ReturnFileIntent);
}
return true;
@ -196,12 +230,11 @@ public class AndroidSharing
{
byte[] ByteArray = null;
if(mInputSharedFile != null)
if(mRequestedSharedFile != null)
{
final FileInputStream DataStream = new FileInputStream(mInputSharedFile.getFileDescriptor());
try
{
final FileInputStream DataStream = new FileInputStream(mRequestedSharedFile.getFileDescriptor());
ByteArray = new byte[DataStream.available()];
DataStream.read(ByteArray);
}
@ -210,7 +243,7 @@ public class AndroidSharing
return null;
}
closeSharedFile();
closeRequestedSharedFile();
}
return ByteArray;
@ -218,7 +251,7 @@ public class AndroidSharing
public Intent getRequestSharedFileIntent(String MimeType)
{
Intent RequestFileIntent = new Intent(Intent.ACTION_PICK);
final Intent RequestFileIntent = new Intent(Intent.ACTION_PICK);
RequestFileIntent.setType(MimeType);
return RequestFileIntent;
}
@ -231,11 +264,11 @@ public class AndroidSharing
Cursor DataCursor;
long FileSize;
closeSharedFile();
closeRequestedSharedFile();
try
{
mInputSharedFile = Resolver.openFileDescriptor(SharedFileUri, "r");
mRequestedSharedFile = Resolver.openFileDescriptor(SharedFileUri, "r");
}
catch(FileNotFoundException e)
{
@ -253,18 +286,18 @@ public class AndroidSharing
return true;
}
public void closeSharedFile()
public void closeRequestedSharedFile()
{
if(mInputSharedFile != null)
if(mRequestedSharedFile != null)
{
try
{
mInputSharedFile.close();
mRequestedSharedFile.close();
}
catch(IOException e)
{
}
mInputSharedFile = null;
mRequestedSharedFile = null;
}
}

View File

@ -13,7 +13,7 @@ ApplicationWindow {
title: "QtAndroidTools Demo"
Component.onCompleted: {
if(QtAndroidSharing.action !== QtAndroidSharing.ACTION_NONE)
if(QtAndroidSharing.receivedSharingAction !== QtAndroidSharing.ACTION_NONE)
{
stackView.push("qrc:/tools/AndroidSharing.qml");
}

View File

@ -8,21 +8,21 @@ Page {
padding: 20
Component.onCompleted: {
if(QtAndroidSharing.action === QtAndroidSharing.ACTION_SEND)
if(QtAndroidSharing.receivedSharingAction === QtAndroidSharing.ACTION_SEND)
{
if(QtAndroidSharing.mimeType === "text/plain")
if(QtAndroidSharing.receivedSharingMimeType === "text/plain")
{
receivedSharedText.text = QtAndroidSharing.getSharedText();
receivedSharedText.text = QtAndroidSharing.getReceivedSharedText();
receivedSharedText.open();
}
else if(QtAndroidSharing.mimeType.startsWith("image") === true)
else if(QtAndroidSharing.receivedSharingMimeType.startsWith("image") === true)
{
QtAndroidTools.insertImage("SharedImage", QtAndroidSharing.getSharedData());
QtAndroidTools.insertImage("SharedImage", QtAndroidSharing.getReceivedSharedBinaryData());
sharedImage.source = "image://QtAndroidTools/SharedImage";
receivedSharedImage.open();
}
}
else if(QtAndroidSharing.action === QtAndroidSharing.ACTION_PICK)
else if(QtAndroidSharing.receivedSharingAction === QtAndroidSharing.ACTION_PICK)
{
imageToShareDialog.open();
}
@ -30,42 +30,28 @@ Page {
Connections {
target: QtAndroidSharing
onRequestedSharedFileReadyToGet: {
onRequestedSharedFileReadyToSave: {
requestedSharedFile.text = "Name: " + name + "\nSize: " + size + "\nMimeType: " + mimeType;
requestedSharedFile.fileName = name;
requestedSharedFile.open();
}
onRequestedSharedFileNotAvailable: {
}
}
Column {
anchors.fill: parent
spacing: 20
Label {
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: "Text to share"
font.bold: true
}
TextField {
id: sharedText
width: parent.width
text: "Hello Qt!"
horizontalAlignment: TextField.AlignHCenter
text: "Share text"
onClicked: QtAndroidSharing.shareText("This is my shared text!")
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: "Share"
onClicked: QtAndroidSharing.shareText(sharedText.text)
}
Label {
anchors.horizontalCenter: parent.horizontalCenter
text: "Share file"
font.bold: true
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: "Share"
onClicked: QtAndroidSharing.shareData("image/jpeg", QtAndroidSystem.dataLocation + "/sharedfiles/logo_falsinsoft.jpg")
text: "Share binary data"
onClicked: QtAndroidSharing.shareBinaryData("image/jpeg", QtAndroidSystem.dataLocation + "/sharedfiles/logo_falsinsoft.jpg")
}
Button {
@ -105,13 +91,15 @@ Page {
id: requestedSharedFile
title: "It's ok to get this file?"
standardButtons: StandardButton.Yes | StandardButton.No
onNo: QtAndroidSharing.closeSharedFile()
onNo: QtAndroidSharing.closeRequestedSharedFile()
onYes: {
QtAndroidTools.insertImage("SharedImage", QtAndroidSharing.getRequestedSharedFile());
sharedImage.source = "image://QtAndroidTools/SharedImage";
var filePath = QtAndroidSystem.dataLocation + "/sharedfiles/" + fileName;
QtAndroidSharing.saveRequestedSharedFile(filePath);
sharedImage.source = "file:/" + filePath;
receivedSharedImage.quitOnClose = false;
receivedSharedImage.open();
}
property string fileName
}
Dialog {
@ -131,11 +119,11 @@ Page {
}
onRejected: {
QtAndroidSharing.returnSharedFile(false);
QtAndroidSharing.shareFile(false);
Qt.quit();
}
onAccepted: {
QtAndroidSharing.returnSharedFile(true, "image/jpeg", QtAndroidSystem.dataLocation + "/sharedfiles/logo_falsinsoft.jpg");
QtAndroidSharing.shareFile(true, "image/jpeg", QtAndroidSystem.dataLocation + "/sharedfiles/logo_falsinsoft.jpg");
Qt.quit();
}
}