如何在Android上注册ACTION_VIEW意向?为什么';我的QApplication是否接收QEvent::FileOpen事件?
我正在尝试注册一个QtQuickAndroid应用程序来打开某类文件并处理它们 据我所知,当使用如何在Android上注册ACTION_VIEW意向?为什么';我的QApplication是否接收QEvent::FileOpen事件?,android,qt,qt5,qevent,qapplication,Android,Qt,Qt5,Qevent,Qapplication,我正在尝试注册一个QtQuickAndroid应用程序来打开某类文件并处理它们 据我所知,当使用QApplication打开一个文件时,它会导致一个被触发的文件 对于这一点,我所掌握的最有力的证据(如果不是决定性的话)是在一个生产系统中发现的commit,再加上大量的和谷歌的结果 所以,我首先创建一个 我就是这样, #include <QtGui> #include <QApplication> #include <QFileOpenEvent> clas
QApplication
打开一个文件时,它会导致一个被触发的文件
对于这一点,我所掌握的最有力的证据(如果不是决定性的话)是在一个生产系统中发现的commit,再加上大量的和谷歌的结果
所以,我首先创建一个
我就是这样,
#include <QtGui>
#include <QApplication>
#include <QFileOpenEvent>
class MyEventFilter : public QObject {
public:
MyEventFilter();
virtual ~MyEventFilter();
protected:
virtual bool eventFilter(QObject* object,QEvent* event);
};
#包括
#包括
#包括
MyEventFilter类:公共QObject{
公众:
MyEventFilter();
虚拟~MyEventFilter();
受保护的:
虚拟布尔事件过滤器(QObject*对象,QEvent*事件);
};
#包括“myeventfilter.h”
MyEventFilter::MyEventFilter():QObject(){}
MyEventFilter::~MyEventFilter(){}
bool MyEventFilter::eventFilter(QObject*object,QEvent*e){
qDebug()类型()==QEvent::FileOpen){
QFile文件(static_cast(e)->file());
qDebug()在阅读并从Freenode上的#qt
获得一些宝贵的帮助后,我将回答自己的问题
看起来在Android中打开文件实际上不会导致QEvent::FileOpen
,这只在带有窗口管理器的系统上有用
相反,我们必须使用Java,然后使用JNI:
package com.foo;
import android.content.Intent;
import org.qtproject.qt5.android.bindings.QtActivity;
class Bar
{
public static native void openUri(String uri);
// Notice the 'native' keyword
}
public class MyActivity extends QtActivity {
public void onNewIntent(Intent i) {
if (i.getAction() == Intent.ACTION_VIEW) {
Bar.openUri(i.getData().toString());
}
super.onNewIntent(i);
}
}
请注意,JNI方法名称中有很多
您可以找到此示例的更新版本。很好,它可以工作。但是我如何读取文件内容?QFile::readAll()抛出错误设备未打开。@LiborB。我一辈子都记不起来了。我会看看是否能在接下来的几天内找到此代码并尝试回答您。
<intent-filter android:label="Foo File" android:priority="1">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="file" android:host="success"/>
<data android:host="*"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.foo"/>
</intent-filter>
package com.foo;
import android.content.Intent;
import org.qtproject.qt5.android.bindings.QtActivity;
class Bar
{
public static native void openUri(String uri);
// Notice the 'native' keyword
}
public class MyActivity extends QtActivity {
public void onNewIntent(Intent i) {
if (i.getAction() == Intent.ACTION_VIEW) {
Bar.openUri(i.getData().toString());
}
super.onNewIntent(i);
}
}
class URIHandler : public QObject {
public:
void openUri(QString uri) {
qDebug() << "Open URI" << uri;
}
}
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL
Java_com_foo_Bar_openUri(JNIEnv *env,
jobject obj,
jstring uri)
{
jboolean isCopy;
isCopy = false;
const char* utf = env->GetStringUTFChars(uri, &isCopy);
handler.openUri(QString(utf));
env->ReleaseStringUTFChars(uri, utf);
}
#ifdef __cplusplus
}
#endif