|
|
导航: |
论坛 -> 移动应用开发
斑竹:flyers,iamdream |
? |
作者: |
|
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:12:56 |
3楼: |
Memu?->?Project?->?Options?->?Application?->?Entitilement?List?->?Secure?File?Sharing?->?Check
----------------------------------------------
FFmpeg?for?Delphi?http://www.CCAVC.com?http://www.DelphiFFmpeg.com
|
作者: |
|
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楼: |
谢谢流云兄,代码已经顺利运行。 可是,并不能够执行安装,也没有任何错误提示。 我再研究一下。
----------------------------------------------
|
|