Запуск apk в приложении android delphi seattle ошибка
По нескольким причинам я не хочу использовать механизм Google Play для обновления приложения для Android. Поэтому я решил создать собственную систему для загрузки и обновления приложения для Android.
Шаг 1: загрузите обновление .apk
файл.
Шаг 2: поместите кнопку в исходное приложение, чтобы пользователь мог нажать на нее, чтобы запустить .apk
для обновления.
Следующий код дает мне ошибку.
procedure TfrmUpdateProgram.DoUpgrade;
{$IF DEFINED(IOS) or DEFINED(ANDROID)}
var Intent : JIntent;
{$ELSE}
{$ENDIF}
begin
{$IF DEFINED(IOS) or DEFINED(ANDROID)}
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setDataAndType(StrToJURI(newAPKFile), StringToJString('application/vnd.android.package-archive'));
SharedActivityContext.startActivity(Intent);
Application.Terminate;
{$ELSE}
ShellExecute(0, PWideChar('Open'), PWideChar(newAPKFile), nil, nil, SW_HIDE);
{$ENDIF}
end;
android.content.activitynotfoundexception: не найдено действий для обработки намерений {act=android.intent.action.view dat=/storage.....update.apk typ=application/vnd.android.package-archive flg=0x1000000}
Какие-нибудь мысли?
2 ответа
Попробуйте удалить звонок Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK)
Это не строго необходимо.
Убедитесь, что .apk
файл доступен для чтения перед запуском Intent
, если вы не храните его в общедоступной внешней папке. И убедитесь, что он доступен через file:
URI.
И убедитесь, что ваше устройство Android настроено на установку приложений из неизвестных источников.
var
Path: JString;
Name: JString;
F: Jfile;
Intent: JIntent;
FileName, DestFileName: string;
FileName := System.IOUtils.TPath.GetDownloadsPath + PathDelim + 'myAPK_name.apk';
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
if TJBuild_VERSION.JavaClass.SDK_INT >= TJBuild_VERSION_CODES.JavaClass.N then
begin
lFile := TJFile.JavaClass.init(StringToJString(FileName));
Intent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION + TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION);
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
//This line used to be in Delphi 10.4
//Data := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,StringToJString('com.embarcadero.BarcodexMS.fileprovider'), lFile);
//Use Following line in Delphi 11.1
Data := TJcontent_FileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider'), lFile);
end
else
begin
Data := TJnet_Uri.JavaClass.parse(StringToJString('file://' + FileName));
end;
Intent.setDataAndType(Data, StringToJString('application/vnd.android.package-archive'));
TAndroidHelper.Activity.startActivity(Intent);