Qt for Android 调用android原生接口分享图片或文字
16lz
2021-01-23
在用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 imagesUriList = new ArrayList(); 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( "com/lyy/test/MainActivity", "shareImage", "(Ljava/lang/String;Ljava/lang/String;Lorg/qtproject/qt5/android/bindings/QtActivity;)V", jTitle.object(), jPath.object(), activity.object());}
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( "com/lyy/airlink/MainActivity", "shareImages", "(Ljava/lang/String;Ljava/lang/String;Lorg/qtproject/qt5/android/bindings/QtActivity;)V", jTitle.object(), jPathList.object(), activity.object());}
字符串分享调用方式类似,这里不再赘述。
更多相关文章
- [Android] 图片裁剪总结——调用系统裁剪
- Android 图片上传框架
- Android svg图片使用
- Android日常整理(一)---android返回键、Fragment、android分割线、
- Android中直接按路径读取properties文件
- 图片切换