私のqtアプリでカメラを使用して画像をキャプチャするコードを作成しました。QtAndroid を使用して、Qt で同等の Java コードを記述しています。
私はすでにカメラを開いて画像をキャプチャしましたが、uriはnullを返し、Androidパイバージョンの携帯電話で突然アプリがクラッシュし、Androidロリポップ携帯電話で適切に動作します.
QAndroid を使用してキャプチャした画像の uri を取得し、Qt で Java と同等のコードを記述するにはどうすればよいですか?
これが私が行ったコードです:
カメラを開くためのコード:-
QAndroidJniObject ACTION_IMAGE_CAPTURE = QAndroidJniObject::getStaticObjectField("android/provider/MediaStore", "ACTION_IMAGE_CAPTURE", "Ljava/lang/String;");
QAndroidJniObject intent("android/content/Intent", "(Ljava/lang/String;)V", ACTION_IMAGE_CAPTURE.object<jstring>());
QtAndroid::startActivity(intent.object<jobject>(), 101, this);
画像 uri を取得するためのコード:-
void UiMan::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject
&data)
{
qDebug()<<"In handelActivityResult";
jint RESULT_OK = QAndroidJniObject::getStaticField<jint>("android/app/Activity", "RESULT_OK");
if (receiverRequestCode == 101 && resultCode == RESULT_OK)
{
qDebug()<<"In If";
QAndroidJniObject uri = data.callObjectMethod("getData", "()Landroid/net/Uri;");
QAndroidJniObject dadosAndroid = QAndroidJniObject::getStaticObjectField("android/provider/MediaStore$MediaColumns", "DATA", "Ljava/lang/String;");
QAndroidJniEnvironment env;
jobjectArray projecao = (jobjectArray)env->NewObjectArray(1, env->FindClass("java/lang/String"), NULL);
jobject projacaoDadosAndroid = env->NewStringUTF(dadosAndroid.toString().toStdString().c_str());
env->SetObjectArrayElement(projecao, 0, projacaoDadosAndroid);
QAndroidJniObject contentResolver = QtAndroid::androidActivity().callObjectMethod("getContentResolver", "()Landroid/content/ContentResolver;");
QAndroidJniObject cursor = contentResolver.callObjectMethod("query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;", uri.object<jobject>(), projecao, NULL, NULL, NULL);
jint columnIndex = cursor.callMethod<jint>("getColumnIndex", "(Ljava/lang/String;)I", dadosAndroid.object<jstring>());
cursor.callMethod<jboolean>("moveToFirst", "()Z");
QAndroidJniObject resultado = cursor.callObjectMethod("getString", "(I)Ljava/lang/String;", columnIndex);
QFile imageFile(resultado.toString());
QDir dir;
if(dir.exists("images")){
qDebug()<<"Folder already exists";
}else {
dir.mkdir("images");
}
QStringList splitedImagePath = resultado.toString().split("/");
QString imageName = splitedImagePath.value(splitedImagePath.length() - 1);
QString dataimgFile = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/images/" + imageName;
// /data/data/org.qtproject.feather/files/images/offLight_Button.png
if (imageFile.exists())
{
QFile cdbfile(dataimgFile);
if (!cdbfile.exists())
{
if(!imageFile.copy(dataimgFile))
qDebug() << "Error :copy failed" ;
QFile::setPermissions(dataimgFile, QFile::WriteOwner | QFile::ReadOwner);
}
else
{
qDebug() << "image exits allready no need to copy " ;
QFile::setPermissions(dataimgFile, QFile::WriteOwner | QFile::ReadOwner);
}
}
else
{
qDebug() << "img Not exit in Assert " << dataimgFile;
}
QVariant imagePath = "file://" + dataimgFile;
emit signalToQml(1148, imagePath, "", "","","","","","");
}
else
{
qDebug() << "Error";
}
}
そう。この問題を解決するために私を助けてください。キャプチャされた画像のビットマップを取得するための同等のqtコードを以下に記述します。
Bitmap bitmap = (Bitmap) data.getExtras().get("data");