Qt for Android 开发App分享文件
项目有了新需求,需要在App生成文件并分享到微信、QQ等。第一个想到的就是微信开发平台,打算找一个js的方法,一次解决Android和ios,结果不支持,
没办法只能单独开发了,继续看微信开发平台的文档,发现很麻烦,需要注册开发者交300大洋,还得上传自己的App进行审核。
偶尔在安晓辉大神的博客里看到Qt on Android的分享,大神的链接:https://blog.csdn.net/foruok/article/details/45066349 看了很受启发,
但这个还不满足需求,我需要分享文件,大神这个例子只能分享文字。于是百度、google找Android原生开发分享的资料。
不啰嗦了,直接上代码,java还是很简单的
public class ShareIntent
{
static public void shareFile(QtActivity activity)
{
String fileName = Environment.getExternalStorageDirectory() + "/要分享的文件夹/文件.txt";
final Uri appUri ;
final File file = new File(fileName);
Intent share = new Intent(Intent.ACTION_SEND);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
appUri = FileProvider.getUriForFile(activity,"App包名.fileprovider", new File(fileName));
share.putExtra(Intent.EXTRA_STREAM,appUri);
}else {
share.putExtra(Intent.EXTRA_STREAM, new File(fileName));
}
share.setType("*/*");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(Intent.createChooser(share, “share”));
}
}
这里的重点是FileProvider.getUriForFile,稍后再细说这个问题,先看看C++怎么调用这段java,新建个类,用JNI来调用java
void QtShare::share()
{
qDebug() << "share-----loading-------------:" ;
QAndroidJniObject activity = QtAndroid::androidActivity();
QAndroidJniObject::callStaticMethod<void>(
"org/qtproject/ShareIntent",
"shareFile",
"(Lorg/qtproject/qt5/android/bindings/QtActivity;)V",
activity.object<jobject>()
);
}
看看怎么用qml调用呢?在main里注册一下
QQmlApplicationEngine engine;
QtShare _share;
engine.rootContext()->setContextProperty("_share", &_share);
在qml下就可以引用了
Button
{
text: "分享文件"
onClicked:
{
_share.share();
}
}
下面重点来了FileProvider.getUriForFile,这个让我困惑很久。FileProvider 是一个特殊的 ContentProvider 的子类,它通过使用 content:// Uri 代替了 file:/// Uri. ,来为另一个app分享文件。
先在AndroidManifest.xml内注册一下
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="你的App包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
然后在res下新建个文件夹xml,然后新建一个xml文件名字和注册里的名字一样filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="my_file"
path="要分享的文件夹/"/>
</paths>
这样就大功告成了,编译代码运行一下看看吧,点击分享只要是手机里装的可以分享的App都可以被拉出来。