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++,具体的传送方式不再赘述,后期会专门写文章介绍。
新闻热点
疑难解答
图片精选