ag游戏庄闲|官方网站
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
?用户名
?密??码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sy1368364703
今日帖子: 12
在线用户: 20
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream ?
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/17 20:03:43
标题:
安卓App自动升级 浏览:390
加入我的收藏
楼主: 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;,不会有任何提示,但是也不会进行安装。
望不吝赐教。谢谢!
----------------------------------------------
作者:
男 wj7927 (元素) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
-
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/26 21:04:21
2楼: 非常感谢你的回复。
我已经试过了,会出现exposed?beyong?app?through?intent.getdata()错误提示。
应该是个权限问题,需要修改xml文件。
我还在研究中,谢谢你了。
----------------------------------------------
作者:
男 codecoolie (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 (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 (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
作者:
男 bbnn38 (伟大的咸鱼) ▲▲▲▲△ -
注册会员
2019/8/28 0:00:36
6楼: 楼上好人,感谢。
----------------------------------------------
-
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/28 9:50:29
7楼: 非常感谢CodeCoolie!
你的代码中:TJFileProvider,我无论是百度,还是使用delphi自己的帮助系统,都没有找到需要引用什么单元。请问具体需要uses什么单元文件?
----------------------------------------------
作者:
男 dengjiyun (流云) ▲▲▲▲△ -
注册会员
2019/8/28 12:49:28
8楼: Androidapi.JNI.Support引用这个单元
----------------------------------------------
-
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/28 14:39:05
9楼: 谢谢流云兄,代码已经顺利运行。
可是,并不能够执行安装,也没有任何错误提示。
我再研究一下。
----------------------------------------------
作者:
男 codecoolie (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
信息
登陆以后才能回复
Copyright ? 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行19.53125毫秒 RSS