Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android上注册ACTION_VIEW意向?为什么';我的QApplication是否接收QEvent::FileOpen事件?_Android_Qt_Qt5_Qevent_Qapplication - Fatal编程技术网

如何在Android上注册ACTION_VIEW意向?为什么';我的QApplication是否接收QEvent::FileOpen事件?

如何在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

我正在尝试注册一个QtQuickAndroid应用程序来打开某类文件并处理它们

据我所知,当使用
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