打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
安卓App自动升级
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/17 20:03:43
标题:安卓App自动升级浏览:1322
加入我的收藏
楼主:IDE:Delphi 10.3.0
问题描述:从自有服务器下载APK安卓包成功,但是无法成功调用该安装包进行安装。
代码如下:
var
Intent: JIntent;
AFile: string;
begin
//PSetup.LAPKFi是已经下载到本地(手机)的APK路径,文件已经成功下载
AFile := 'content://'+PSetup.LAPKFi;
Intent:=TJIntent.Create;
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(AFile)),
StringToJString('application/vnd.android.package-archive'));
try
TAndroidHelper.Activity.startActivity(Intent);
ShowMessage('Install Finished.');
except
on e: Exception do
begin
ShowMessage('Error Message:'+e.Message);
end;
end;
end;
如果使用AFile := 'file://'+PSetup.LAPKFi;会遇到exposed beyong app through intent.getdata()错误提示,换成现在的AFile := 'content://'+PSetup.LAPKFi;,不会有任何提示,但是也不会进行安装。
望不吝赐教。谢谢!
----------------------------------------------
-
作者:
(元素)★☆☆☆☆-
盒子活跃会员
2019/8/19 10:10:24
1楼:var
aFile:Jfile;
Intent:JIntent;
begin
aFile:=TJfile.JavaClass.init(StringToJString(TPath.GetSharedDownloadsPath),StringToJString('XXX.apk'));
Intent := TJIntent.Create ;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Intent.setDataAndType(TJnet_Uri.JavaClass.fromFile(aFile),StringToJString('application/vnd.android.package-archive'));
SharedActivityContext.startActivity(Intent);
end;
----------------------------------------------
-
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/26 21:04:21
2楼:非常感谢你的回复。
我已经试过了,会出现exposed beyong app through intent.getdata()错误提示。
应该是个权限问题,需要修改xml文件。
我还在研究中,谢谢你了。
----------------------------------------------
-
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/26 21:12:56
3楼:Memu -> Project -> Options -> Application -> Entitilement List -> Secure File Sharing -> Check
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/26 21:22:23
4楼:7.0以下用TJnet_Uri.JavaClass.fromFile
7.0及以上用JFileProvider,Intent需要FLAG_GRANT_READ_URI_PERMISSION
8.0以下需要ACTION_VIEW
8.0及以上需要ACTION_INSTALL_PACKAGE
同时需要FLAG_ACTIVITY_NEW_TASK
等我待会找找我以前写的代码
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/26 23:30:40
5楼:procedure _InstallApk(Apk: string);
var
LFile: JFile;
LIntent: JIntent;
begin
LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));
LIntent := TJIntent.Create;
LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
LIntent.setDataAndType(TJnet_Uri.JavaClass.fromFile(LFile), StringToJString('application/vnd.android.package-archive'));
TAndroidHelper.Context.startActivity(LIntent);
end;
procedure InstallApk(Apk: string);
var
LFile: JFile;
LIntent: JIntent;
LNet_Uri: Jnet_Uri;
begin
if not TOSVersion.Check(7, 0) then
begin
_InstallApk(Apk);
Exit;
end;
LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));
LIntent := TJIntent.Create;
if TOSVersion.Check(8, 0) then
LIntent.setAction(TJIntent.JavaClass.ACTION_INSTALL_PACKAGE)
else
LIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
if TOSVersion.Check(7, 0) then
begin
// fix: android.os.FileUriExposedException: exposed beyond app through Intent.getData()
// Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check it
LIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
LNet_Uri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,
StringToJString(JStringToString(TAndroidHelper.Context.getPackageName) + '.fileprovider'), LFile);
end
else
LNet_Uri := TJnet_Uri.JavaClass.fromFile(LFile);
LIntent.setDataAndType(LNet_Uri, StringToJString('application/vnd.android.package-archive'));
TAndroidHelper.Context.startActivity(LIntent);
end;
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(伟大的咸鱼)▲▲▲▲△-
注册会员
2019/8/28 0:00:36
6楼:楼上好人,感谢。
----------------------------------------------
-
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/28 9:50:29
7楼:非常感谢CodeCoolie!
你的代码中:TJFileProvider,我无论是百度,还是使用delphi自己的帮助系统,都没有找到需要引用什么单元。请问具体需要uses什么单元文件?
----------------------------------------------
-
作者:
(流云)▲▲▲▲▲-
注册会员
2019/8/28 12:49:28
8楼:Androidapi.JNI.Support引用这个单元
----------------------------------------------
-
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/28 14:39:05
9楼:谢谢流云兄,代码已经顺利运行。
可是,并不能够执行安装,也没有任何错误提示。
我再研究一下。
----------------------------------------------
-
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/29 10:38:26
10楼:Delphi 10.3.1
Android 7.1/8.0/9.0
测试过都没问题
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/29 14:14:36
11楼:@CodeCoolie,我正在找问题,应该是我这里的问题。
非常感谢你的大力支持并提供代码,感谢!
顺便问一句:函数参数:APK是安装包在本地的路径,前面是否需要加前缀?比如:file://或者content://?
----------------------------------------------
-
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/29 20:57:04
12楼:用TPath处理路径(跨平台的路径相关应该都使用System.IOUtils里提供的东西来写)
例如
APK := TPath.Combine(TPath.GetTempPath, 'new.apk');
download('server://foo/bar/new.apk', APK); // save as APK
InstallAPK(APK);
在安卓平台路径是*nix规则的,自己应用内不需要前缀
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(CodeCoolie)▲▲▲▲△-
注册会员
2019/8/29 21:04:58
13楼:另外8.0以上要在manifest里加权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
至于动态权限申请相关(在当前应用安装应用,需要系统授权),我只是自己玩玩,所以没去研究
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
(圣光)★☆☆☆☆-
盒子活跃会员
2019/8/31 10:06:39
14楼:非常感谢CodeCoolie,现已调试成功!
在AndroidManifest.template.xml文件中加入
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>即可。
其他方面的设置和代码与之前一样,未加改动。
再次表示感谢,也同时感谢所有提供帮助的朋友!
感谢!
----------------------------------------------
-
作者:
(.)★☆☆☆☆-
盒子活跃会员
2020/3/6 23:16:41
15楼:楼主, 我按您1楼的代码.
//AFile := 'content://'+PSetup.LAPKFi;
改为:
AFile :='content:///storage/emulated/0/Android/data/com.embarcadero.kClientApp/files/Download/Setup3.apk';
(我确认路径 /storage/emulated/0/Android/data/com.embarcadero.kClientApp/files/Download/Setup3.apk 是正确的)
同时,我也加按您14楼,加了权限.
最后, 调出安装界面, 但是提示: 解析软件包时出同出现问题
---------->
我怀疑是AFile 路径书写错误, 因为我随便乱填个路径, 也会调出安装界面,并提示:解析软件包时出同出现问题
如果楼主有空. 烦请指导一下我. 万分感谢.
----------------------------------------------
...
作者:
(.)★☆☆☆☆-
盒子活跃会员
2020/3/7 13:53:21
16楼:其它朋友, 如果有答案, 也帮忙指点一下. 谢谢...
----------------------------------------------
...
作者:
(.)★☆☆☆☆-
盒子活跃会员
2020/3/7 14:59:55
17楼:应当就是 content://这个路径写得不对....
----------------------------------------------
...
作者:
(.)★☆☆☆☆-
盒子活跃会员
2020/3/7 16:22:27
18楼:
(原始路径是: /storage/emulated/0/Android/data/com.embarcadero.kClientApp/files/Setup3.apk  )
content://com.embarcadero.kClientApp/files/Setup3.apk
我试着用这个,也不行...
----------------------------------------------
...
作者:
(bdl1)▲▲▲△△-
注册会员
2020/3/7 19:58:07
19楼:https://www.cnblogs.com/kinglandsoft/p/11934682.html
----------------------------------------------
-我的新浪博客
作者:
(.)★☆☆☆☆-
盒子活跃会员
2020/3/8 12:03:00
20楼:终于搞定了,花了整整3天时间.
分享大家: 
http://bbs.2ccc.com/topic.asp?topicid=580430
欢迎指点
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi XE7 android 实现的在线更新APP的一个程序
Delphi Android APP 自动更新: 使用 RADStudio10.3.3 并在 Android 10 测试通过
C++ Builder XE7 调用JAVA的JAR文件
APK文件查看、修改和签名 - dospy智能手机网 塞班 安卓Android 苹果iPh...
【新提醒】Unity中针对Android Apk的签名验证(C#实现)
WindowsAndroid – 在 Windows 上运行的 Android
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服