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()+"/picture/";//+ m_instance.getPhotoFileName();//设置图片文件路径,getSDPath()和getPhotoFileName()具体实现在下面
File f = new File(m_instance.mPhotoPath);
if(!f.exists()){
f.mkdirs();
}
m_instance.mPhotoPath += m_instance.getPhotoFileName();
m_instance.mPhotoFile = new File(m_instance.mPhotoPath);
if (!m_instance.mPhotoFile.exists()) {
try {
if(!m_instance.mPhotoFile.createNewFile()) {
System.out.println("File already exists");
}
} catch (IOException ex) {
System.out.println(ex);
}
}
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";
}