DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: liugggggxxxxx
今日帖子: 34
在线用户: 15
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/17 20:03:43
标题:
安卓App自动升级 浏览:607
加入我的收藏
楼主: 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
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/29 14:14:36
11楼: @CodeCoolie,我正在找问题,应该是我这里的问题。
非常感谢你的大力支持并提供代码,感谢!

顺便问一句:函数参数:APK是安装包在本地的路径,前面是否需要加前缀?比如:file://或者content://?
----------------------------------------------
作者:
男 codecoolie (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 (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
作者:
男 terony (圣光) ★☆☆☆☆ -
盒子活跃会员
2019/8/31 10:06:39
14楼: 非常感谢CodeCoolie,现已调试成功!
在AndroidManifest.template.xml文件中加入
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>即可。
其他方面的设置和代码与之前一样,未加改动。
再次表示感谢,也同时感谢所有提供帮助的朋友!
感谢!
----------------------------------------------
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行46.875毫秒 RSS