首页 > 系统 > Android > 正文

Qt for Android调用原生接口打开相机拍照并存储照片

2019-11-06 09:42:23
字体:
来源:转载
供稿:网友

Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片。原理很简单,现在java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C++ 端调用。

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

public class MainActivity extends org.qtPRoject.qt5.android.bindings.QtActivity定义一个公有的静态函数

	/**        *打开系统相机拍照并返回相片        */        public static void openSystemCamera(QtActivity activity){            try {                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//开始拍照                    m_instance.mPhotoPath = m_instance.getSDPath()+"/AirLink/"+ m_instance.getPhotoFileName();//设置图片文件路径,getSDPath()和getPhotoFileName()具体实现在下面                    m_instance.mPhotoFile = new File(m_instance.mPhotoPath);                    if (!m_instance.mPhotoFile.exists()) {                            m_instance.mPhotoFile.createNewFile();//创建新文件                    }                    intent.putExtra(MediaStore.EXTRA_OUTPUT,//Intent有了图片的信息                                    Uri.fromFile(m_instance.mPhotoFile));                    activity.startActivityForResult(intent, CAMERA_RESULT);//跳转界面传回拍照所得数据                } catch (Exception e) {                    e.printStackTrace();                }            }        public String getSDPath(){            File sdDir = null;            boolean sdCardExist = Environment.getExternalStorageState()                            .equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在            if(sdCardExist)            {                    sdDir = Environment.getExternalStorageDirectory();//获取目录            }            return sdDir.toString();        }        private String getPhotoFileName() {            Date date = new Date(System.currentTimeMillis());            SimpleDateFormat dateFormat = new SimpleDateFormat(                            "'IMG'_yyyyMMdd_HHmmss");            return dateFormat.format(date)  +".jpg";        }      @Override      protected void onActivityResult(int requestCode, int resultCode, Intent data) {          if (requestCode == CAMERA_RESULT) {                if(resultCode != RESULT_OK){                    return;                }//                makeToast(mPhotoPath);                //m_transImageToQt.OpenCameraGetImgPath(mPhotoPath);            }      }

C++中调用接口

void AndroidInterface::openCamera(){    QAndroidJniObject activity = QtAndroid::androidActivity();    QAndroidJniObject::callStaticMethod<void>(                "com/lyy/test/MainActivity",                "openSystemCamera",                "(Lorg/qtproject/qt5/android/bindings/QtActivity;)V",                activity.object<jobject>());}

拍照完成后会进入到回调函数,在回调函数中将图片存储路径传送到C++,具体的传送方式不再赘述,后期会专门写文章介绍。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表