功能:APP上用户注册时往往会从相册中去选择一张图片,实现系统相册的调用及头像的加载
对于不了解android和JAVA的同志们来说,这是有困难的,而我就遇到了很多坑
一、网上找资料
发现有两种方式可以实现
一种是纯C++与JNI结合,可参考https://www.jianshu.com/p/d47505f27125
一种是C++调用JAVA函数,我使用了第二种
二、踩坑
2.1 参考https://blog.csdn.net/qyvlik/article/details/51225837,下载了一份源码,可以直接编译运行
2.2 将这份源码嵌入到自己的APP中报错如下:
Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5326, uid=10327 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
意思就是权限请求失败了,调用相册需要请求安卓外部存储的读写权限
然后添加权限,如下图,其中
android.permission.READ_EXTERNAL_STORAGE与android.permission.WRITE_EXTERNAL_STORAGE是这里需要的
然后依然报错。。。
思考良久,才了解到调用android6.0后的API时是采用的动态权限设置。而恰恰demo中用的API22,而我的是API26
OK,此时有两个办法解决
一个是将API版本降到22,可解决这个问题,但是会导致无法替换以前的版本,想哭。。。(又恰恰我的APP已经有客户在用了),好吧,用第二种方式
另一个就是在添加动态权限分配功能,了解Java和android先,参考网址:
https://www.cnblogs.com/zanzg/p/9129375.html
https://blog.csdn.net/qq_22230935/article/details/53876092
选择需要的包和函数嵌入到自己的代码中
至此大功告成
三、源码
java部分,仅供参考(demo有空再写)
public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity{
private final static String TAG = "QtFullscreen";
private static MainActivity activity;
public static Context sContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sContext = getApplicationContext(); //获取程序句柄
setStatusBarFullTransparent();
activity = MainActivity.this;
/* // 设置全屏并且状态栏悬浮程序之上
getWindow().addFlags(WindowM