Hej. Bawię się LazToApk. Mało to udokumentowane i błędzę trochę po omacku. Na forum supportu cisza na moje inne pytanie. Także spróbuje tutaj zapytać w Newbie, bo pewnie rozwiązanie i banalne. A i więcej osób tu zagląda. Ok, standardowe metody wywołujące otwieranie adresu w zainstalowanych przeglądkach, jak OpenUrl
otworzą nam tylko adres podany jako na przykład http:olesio.eu
- celowo trzeba podać bez //
. I wtedy działa. Ale wszystko co podamy dalej w adresie po / zostanie źle przetworzone, ponieważ nie pokazuje się strona docelowa tylko about:blank
. Wynika to z braku obsługi trzeciego parametru (który dodatkowo obsługuje mój kod poniźej po poprawkach). Wszystko było testowane na zaktualizowanym i najnowszym Androidzie KitKat, na tablecie Lenovo Yoga 2.
Natomiast taki kod jak poniżej działa prawie ok. Ale w przeglądarce otwiera się adres http://olesio.eu/#apk
. I tutaj właśnie pytanie, jak pozbyć się tego #
i jednocześnie móc wywołać wszystko ok?
procedure TfrmProject1Main.CDButton4Click(Sender: TObject);
var
javaAndroidNetUriClass: JClass;
javaMethod_Uri_fromParts: jmethodid = nil;
lJavaString, lJavaString2, lJavaString3: jstring;
lJavaURIObject: JObject;
lParams: array[0..2] of JValue;
begin
javaAndroidContentContextClass :=
javaEnvRef^^.FindClass(javaEnvRef, 'android/content/Context');
javaAndroidNetUriClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/net/Uri');
javaMethod_Uri_fromParts := javaEnvRef^^.GetStaticMethodID(javaEnvRef,
javaAndroidNetUriClass, 'fromParts',
'(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;');
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar('http'));
lParams[0].l := lJavaString;
lJavaString2 := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar('olesio.eu'));
lParams[1].l := lJavaString2;
lJavaString3 := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar('apk'));
lParams[2].l := lJavaString3;
lJavaURIObject := javaEnvRef^^.CallStaticObjectMethodA(javaEnvRef,
javaAndroidNetUriClass, javaMethod_Uri_fromParts, @lParams[0]);
Widget.DoOpenAndroidURI(lJavaURIObject, 'text/html');
end;
Widget
to TCDWidgetSet
zadeklarowany globalnie. Powyższy kod wziąłem z pliku \LAZTOAPK\downloads\laz4android\lcl\interfaces\customdrawn\customdrawnobject_android.inc
. I poniżej kod oryginalnej metody DoOpenAndroidURI
. Wiem, że w Google są przykłady jak to się prosto trzema linijkami odpala w Javie. Ale ja wolę próbować pisać w obiektowym Pascalu, skoro jest gotowe środowisko kompilujące i tworzące gotowe *.apk pod Androida.
function TCDWidgetSet.DoOpenAndroidURI(AURI: JObject; AMimeType: string): Boolean;
var
// Java IDs
javaAndroidContentContextClass: JClass;
javaAndroidContentIntentClass: JClass;
javaAndroidContentPmPackageManagerClass: JClass;
javaAndroidAppActivityClass: JClass;
javaJavaUtilListClass: JClass;
javaMethod_Intent_new: jmethodid = nil;
javaMethod_Intent_setDataAndType: jmethodid = nil;
javaMethod_Context_getPackageManager: jmethodid = nil;
javaMethod_PmPackageManager_queryIntentActivities: jmethodid = nil;
javaMethod_Activity_startActivity: jmethodid = nil;
javaMethod_List_size: JMethodID = nil;
// Java Object instances
lJavaString: jstring;
javaViewDocObject: JObject;
lJavaPackageManagerObject: JObject;
lJavaListObject: JObject;
lJavaArray: JArray;
lJavaInt: JInt;
// array for the parameters
lParams: array[0..1] of JValue;
//
begin
Result := False;
if (javaEnvRef = nil) then Exit;
// First IDs
DebugLn(Format(':>[DoOpenAndroidURI] AURI=%x', [PtrInt(AURI)]));
javaAndroidContentContextClass := javaEnvRef^^.FindClass(javaEnvRef,'android/content/Context');
javaAndroidContentIntentClass := javaEnvRef^^.FindClass(javaEnvRef,'android/content/Intent');
javaAndroidContentPmPackageManagerClass := javaEnvRef^^.FindClass(javaEnvRef,'android/content/pm/PackageManager');
javaAndroidAppActivityClass := javaEnvRef^^.FindClass(javaEnvRef,'android/app/Activity');
javaJavaUtilListClass := javaEnvRef^^.FindClass(javaEnvRef,'java/util/List');
javaMethod_Intent_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidContentIntentClass, '<init>', '(Ljava/lang/String;)V');
javaMethod_Intent_setDataAndType := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidContentIntentClass, 'setDataAndType', '(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;');
javaMethod_Context_getPackageManager := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidContentContextClass, 'getPackageManager', '()Landroid/content/pm/PackageManager;');
javaMethod_PmPackageManager_queryIntentActivities := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidContentPmPackageManagerClass, 'queryIntentActivities', '(Landroid/content/Intent;I)Ljava/util/List;');
javaMethod_Activity_startActivity := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidAppActivityClass, 'startActivity', '(Landroid/content/Intent;)V');
javaMethod_List_size := javaEnvRef^^.GetMethodID(javaEnvRef, javaJavaUtilListClass, 'size', '()I');
// Intent viewDoc = new Intent(Intent.ACTION_VIEW);
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, javaConstant_Intent_ACTION_VIEW);
lParams[0].l := lJavaString;
javaViewDocObject := javaEnvRef^^.NewObjectA(javaEnvRef, javaAndroidContentIntentClass, javaMethod_Intent_new, @lParams[0]);
// viewDoc.setDataAndType(uri, "application/pdf");
lParams[0].l := AURI;
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(AMimeType));
lParams[1].l := lJavaString;
javaEnvRef^^.CallObjectMethodA(javaEnvRef, javaViewDocObject, javaMethod_Intent_setDataAndType, @lParams[0]);
// PackageManager pm = this.getPackageManager();
lJavaPackageManagerObject := javaEnvRef^^.CallObjectMethod(javaEnvRef, javaActivityObject, javaMethod_Context_getPackageManager);
// List<ResolveInfo> apps = pm.queryIntentActivities(viewDoc, PackageManager.MATCH_DEFAULT_ONLY);
lParams[0].l := javaViewDocObject;
lParams[1].i := javaConstant_PackageManager_MATCH_DEFAULT_ONLY;
lJavaListObject := javaEnvRef^^.CallObjectMethodA(javaEnvRef, lJavaPackageManagerObject, javaMethod_PmPackageManager_queryIntentActivities, @lParams[0]);
// int lSize = apps.size()
lJavaInt := javaEnvRef^^.CallIntMethod(javaEnvRef, lJavaListObject, javaMethod_List_size);
// if (lSize > 0) this.startActivity(viewDoc);
if lJavaInt > 0 then
begin
lParams[0].l := javaViewDocObject;
javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, javaMethod_Activity_startActivity, @lParams[0]);
Result := True;
DebugLn(':<[DoOpenAndroidURI] Success');
end
else
DebugLn(':<[DoOpenAndroidURI] There are no activities registered for the mimetype ' + AMimeType);
end;