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++,具體的傳送方式不再贅述,后期會專門寫文章介紹。
新聞熱點
疑難解答
圖片精選