0

私の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");
4

0 に答える 0