安卓App自动升级问题
导航:论坛 ->移动应用开发 斑竹:flyers,iamdream作者:
terony (圣光) ★☆☆☆☆ -盒子活跃会员2019/8/17 20:03:43标题: 安卓App自动升级 浏览:2175加入我的收藏楼主: IDE:Delphi 10.3.0问题描述:从自有服务器下载APK安卓包成功,但是无法成功调用该安装包进行安装。代码如下:varIntent: 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'));tryTAndroidHelper.Activity.startActivity(Intent);ShowMessage('Install Finished.');excepton e: Exception dobeginShowMessage('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:241楼: varaFile:Jfile;Intent:JIntent;beginaFile:=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:212楼: 非常感谢你的回复。我已经试过了,会出现exposed beyong app through intent.getdata()错误提示。应该是个权限问题,需要修改xml文件。我还在研究中,谢谢你了。-----------------------------------------------作者:
codecoolie (CodeCoolie) ▲▲▲▲▲ -注册会员2019/8/26 21:12:563楼: 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:234楼: 7.0以下用TJnet_Uri.JavaClass.fromFile7.0及以上用JFileProvider,Intent需要FLAG_GRANT_READ_URI_PERMISSION8.0以下需要ACTION_VIEW8.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:405楼: procedure _InstallApk(Apk: string);varLFile: JFile;LIntent: JIntent;beginLFile := 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);varLFile: JFile;LIntent: JIntent;LNet_Uri: Jnet_Uri;beginif not TOSVersion.Check(7, 0) thenbegin_InstallApk(Apk);Exit;end;LFile := TJFile.JavaClass.init(StringToJString(ExtractFilePath(Apk)), StringToJstring(ExtractFileName(Apk)));LIntent := TJIntent.Create;if TOSVersion.Check(8, 0) thenLIntent.setAction(TJIntent.JavaClass.ACTION_INSTALL_PACKAGE)elseLIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);LIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);if TOSVersion.Check(7, 0) thenbegin// fix: android.os.FileUriExposedException: exposed beyond app through Intent.getData()// Project -> Options -> Application -> Entitlement List -> Secure File Sharing -> Check itLIntent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);LNet_Uri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,StringToJString(JStringToString(TAndroidHelper.Context.getPackageName) + '.fileprovider'), LFile);endelseLNet_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:366楼: 楼上好人,感谢。-----------------------------------------------作者:
terony (圣光) ★☆☆☆☆ -盒子活跃会员2019/8/28 9:50:297楼: 非常感谢CodeCoolie!你的代码中:TJFileProvider,我无论是百度,还是使用delphi自己的帮助系统,都没有找到需要引用什么单元。请问具体需要uses什么单元文件?-----------------------------------------------作者:
dengjiyun (流云) ▲▲▲▲▲ -注册会员2019/8/28 12:49:288楼: Androidapi.JNI.Support引用这个单元-----------------------------------------------作者:
terony (圣光) ★☆☆☆☆ -盒子活跃会员2019/8/28 14:39:059楼: 谢谢流云兄,代码已经顺利运行。可是,并不能够执行安装,也没有任何错误提示。我再研究一下。-----------------------------------------------作者:
codecoolie (CodeCoolie) ▲▲▲▲▲ -注册会员2019/8/29 10:38:2610楼: Delphi 10.3.1Android 7.1/8.0/9.0测试过都没问题----------------------------------------------FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com作者:
terony (圣光) ★☆☆☆☆ -盒子活跃会员2019/8/29 14:14:3611楼: @CodeCoolie,我正在找问题,应该是我这里的问题。非常感谢你的大力支持并提供代码,感谢!顺便问一句:函数参数:APK是安装包在本地的路径,前面是否需要加前缀?比如:file://或者content://?-----------------------------------------------作者:
codecoolie (CodeCoolie) ▲▲▲▲▲ -注册会员2019/8/29 20:57:0412楼: 用TPath处理路径(跨平台的路径相关应该都使用System.IOUtils里提供的东西来写)例如APK := TPath.Combine(TPath.GetTempPath, 'new.apk');download('server://foo/bar/new.apk', APK); // save as APKInstallAPK(APK);在安卓平台路径是*nix规则的,自己应用内不需要前缀----------------------------------------------FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com作者:
codecoolie (CodeCoolie) ▲▲▲▲▲ -注册会员2019/8/29 21:04:5813楼: 另外8.0以上要在manifest里加权限<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>至于动态权限申请相关(在当前应用安装应用,需要系统授权),我只是自己玩玩,所以没去研究----------------------------------------------FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com作者:
terony (圣光) ★☆☆☆☆ -盒子活跃会员2019/8/31 10:06:3914楼: 非常感谢CodeCoolie,现已调试成功!在AndroidManifest.template.xml文件中加入<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>即可。其他方面的设置和代码与之前一样,未加改动。再次表示感谢,也同时感谢所有提供帮助的朋友!感谢!-----------------------------------------------作者:
aknightchen (.) ★☆☆☆☆ -盒子活跃会员2020/3/6 23:16:4115楼: 楼主, 我按您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 路径书写错误, 因为我随便乱填个路径, 也会调出安装界面,并提示:解析软件包时出同出现问题如果楼主有空. 烦请指导一下我. 万分感谢.----------------------------------------------...作者:
aknightchen (.) ★☆☆☆☆ -盒子活跃会员2020/3/7 13:53:2116楼: 其它朋友, 如果有答案, 也帮忙指点一下. 谢谢...----------------------------------------------...作者:
aknightchen (.) ★☆☆☆☆ -盒子活跃会员2020/3/7 14:59:5517楼: 应当就是 content://这个路径写得不对....----------------------------------------------...作者:
aknightchen (.) ★☆☆☆☆ -盒子活跃会员2020/3/7 16:22:2718楼:(原始路径是: /storage/emulated/0/Android/data/com.embarcadero.kClientApp/files/Setup3.apk )content://com.embarcadero.kClientApp/files/Setup3.apk我试着用这个,也不行...----------------------------------------------...作者:
bdl1 (bdl1) ▲▲▲▲△ -注册会员2020/3/7 19:58:0719楼: https://www.cnblogs.com/kinglandsoft/p/11934682.html-----------------------------------------------我的新浪博客作者:
aknightchen (.) ★☆☆☆☆ -盒子活跃会员2020/3/8 12:03:0020楼: 终于搞定了,花了整整3天时间.分享大家:
http://bbs.2ccc.com/topic.asp?topicid=580430欢迎指点----------------------------------------------...作者:
patebeng (patebeng) ▲△△△△ -注册会员2021/3/4 10:44:1721楼:离心泵螺杆泵离心水泵全焊接球阀焊接球阀化工泵磁力泵螺杆泵离心泵上海螺杆泵上海离心泵直埋全焊接球阀埋地全焊接球阀螺杆油泵球阀厂球阀Fully Welded Ball Valve107all Welded Ball Valve182Welded Ball Valve in china47Fully Welded Ball Valve in china39----------------------------------------------污泥螺杆泵氟塑料磁力泵化工离心泵多级离心泵离心泵回复此贴UBB标签:金属探测器金属检测仪金属探测仪金属检测机地下金属探测器金属安检门重量选别机贴子内容:邮件通知: 如果有回复请邮件通知我包含附件:大小限制:19.90M,扩展名限制:gif|jpg|png|doc|zip|rar|chm|pdf|mid|mp3|asf|rm|swf|txt(Ctrl+Enter提交)