Qt for Android 调用android原生接口分享图片或文字

在用Qt开发android应用的时候,有一个需求是通过调用android原生接口去实现图片分享功能,原理很简单,首先在java文件中用android接口封装一个分享功能的方法,然后在C++中调用QAndroidJniObject::callStaticMethod即可。

首先,如果是一个新创建的Qt工程,需要创建一个AndroidManifest.xml文件,创建过程不再赘述,然后创建一个Java的类,继承于

public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity
 

然后定义一个公有的静态函数

   /**
     * 分享功能
     */
     //分享单张图片
    public static void shareImage(String title,
                                 String path, QtActivity activity)
    {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/png");
        File file = new File(path);
        share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        activity.startActivity(Intent.createChooser(share, title));
    }
其中,title是分享对话框的显示标题,path是要分享的图片的保存位置

当然,还可以分享单独的文字内容,如下

     public static void shareString(String title,
                                 String content, QtActivity activity)
    {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("text/plain");//分享字符串
        share.putExtra(Intent.EXTRA_TEXT, content);
        activity.startActivity(Intent.createChooser(share, title));
    }

还可以同时分享多张图片,如下

//分享多张图片
    public static void shareImages(String title,
                                    String imagesPath,QtActivity activity)
    {
        String[] pathList = imagesPath.split("\\|"); //由于"|"是转义字符,所以不能直接写 "|"做分割
        ArrayList<Uri> imagesUriList = new ArrayList<Uri>();
        for(int i = 0 ; i < pathList.length ; ++i){
            File file = new File(pathList[i]);
            if(file.isFile())
            {
                imagesUriList.add(Uri.fromFile(file));
            }
        }

        Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
        intent.setType("image/*");
        intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imagesUriList);
        intent.putExtra(Intent.EXTRA_SUBJECT, title);
        activity.startActivity(Intent.createChooser(intent, title));
    }

这里写得有些复杂,imagePath是从C++端传过来的图片的路径,我把多张图片路径通过字符串连接起来,并用“|”隔开,然后在java端解析字符串将其分为每一个独立的图片路径,再去分别机型分享。


接下来看看C++端的调用方式

单张图片分享

void AndroidInterface::share(const QString &title, const QString &path)
{
    QAndroidJniObject jTitle = QAndroidJniObject::fromString(title);
    QAndroidJniObject jPath = QAndroidJniObject::fromString(path);
    QAndroidJniObject activity = QtAndroid::androidActivity();
    QAndroidJniObject::callStaticMethod<void>(
                                            "com/lyy/test/MainActivity",
                                            "shareImage",
                                            "(Ljava/lang/String;Ljava/lang/String;Lorg/qtproject/qt5/android/bindings/QtActivity;)V",
                                            jTitle.object<jstring>(),
                                            jPath.object<jstring>(),
                                            activity.object<jobject>());
}


多张图片分享

void AndroidInterface::shareImages(const QString &title, const QStringList &imagesPathList)
{
    QString imagesPath;
    foreach (QString str, imagesPathList) {
       imagesPath += str + "|";
    }
    imagesPath = imagesPath.remove(imagesPath.size() - 1,1).trimmed();
    QAndroidJniObject jTitle = QAndroidJniObject::fromString(title);
    QAndroidJniObject jPathList = QAndroidJniObject::fromString(imagesPath);
    QAndroidJniObject activity = QtAndroid::androidActivity();
    QAndroidJniObject::callStaticMethod<void>(
                                            "com/lyy/airlink/MainActivity",
                                            "shareImages",
                                            "(Ljava/lang/String;Ljava/lang/String;Lorg/qtproject/qt5/android/bindings/QtActivity;)V",
                                            jTitle.object<jstring>(),
                                            jPathList.object<jstring>(),
                                            activity.object<jobject>());
}

字符串分享调用方式类似,这里不再赘述。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值