如何在Android ACTION_VIEW意向登记? 为什么我的QApplication收到Q

2019-11-04 01:49发布

我想注册一个QtQuick的Android应用程序中打开某些类文件,并处理它们。

从我所收集,当一个文件被打开了QApplication它导致QEvent::FileOpen被解雇。

这个最强的(如果不确定的)证据,我已经是这个提交在生产系统中发现,加了一些博客文章和谷歌的结果。

所以,我首先创建一个新的空QtQuick项目 。

我写一篇EventFilter ,就像这样:

#include <QtGui>
#include <QApplication>

#include <QFileOpenEvent>

class MyEventFilter : public QObject {
  public:
  MyEventFilter();
  virtual ~MyEventFilter();
protected:
  virtual bool eventFilter(QObject* object,QEvent* event);
};

#include "myeventfilter.h"

MyEventFilter::MyEventFilter() : QObject () {}
MyEventFilter::~MyEventFilter() {}
bool MyEventFilter::eventFilter(QObject* object,QEvent* e) {
  qDebug() << "Received" << e->type();
  if (e->type() == QEvent::FileOpen) {
      QFile file(static_cast<QFileOpenEvent *>(e)->file());
      qDebug() << "File to open:" << file.fileName();
      // This is where I would do stuff
      return true;
  } else {
      return QObject::eventFilter(object,e);
  }
}

然后我进行注册 ,并相应地编辑我的表现 ,通过增加

        <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>

在这一点上,我启动我在Android模拟器应用。

当我打开一个.foo在我的AVD从ES文件浏览器文件适用于Nexus 5,API 22,我的应用程序确实在前台带来的 ,但没有 FileOpen的事件记录。

如果设置我的过滤方法中的断点我似乎没有被击中它。

这让我为难。

我通过扩展尝试了另一种方法QApplication和超载event(QEvent *)以几乎相同的结果(没有命中)。

还有什么比我做错了?


请找到该MWE完整的仓库在这里 。

Answer 1:

我会回答后细读我自己的问题波格丹的教程 ,并自收到一些宝贵的帮助#qt Freenode上。

它看起来像Android中打开一个文件 ,事实上,导致QEvent::FileOpen ,只与一个窗口管理系统是非常有用的。

相反,人们必须继承QtActivity并重写onIntent在Java中,然后调用适当的C ++方法与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);
    }
}

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

请注意,有一些棘手的细微之处用JNI方法名。

你可以找到这个例子的更新,工作版本这里 。



文章来源: How to register for ACTION_VIEW Intent on Android? Why doesn't my QApplication receive QEvent::FileOpen events?