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;