作者: | | 2019/8/17 20:03:43 | 标题: | | 加入我的收藏 | 楼主: | 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文件。 我还在研究中,谢谢你了。 ---------------------------------------------- - |
作者: | | 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 |
作者: | | 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楼: | 谢谢流云兄,代码已经顺利运行。 可是,并不能够执行安装,也没有任何错误提示。 我再研究一下。 ---------------------------------------------- - |
作者: | | 2019/8/29 14:14:36 | 11楼: | @CodeCoolie,我正在找问题,应该是我这里的问题。 非常感谢你的大力支持并提供代码,感谢!
顺便问一句:函数参数:APK是安装包在本地的路径,前面是否需要加前缀?比如:file://或者content://? ---------------------------------------------- - |
作者: | | 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 |
作者: | | 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 (bdl1) | ▲▲▲△△ | - | 注册会员 |
| 2020/3/7 19:58:07 | 19楼: | https://www.cnblogs.com/kinglandsoft/p/11934682.html ---------------------------------------------- -我的新浪博客 |
|