Qt for Android 开发App分享文件

  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都可以被拉出来。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值