当我尝试打开文件时,应用程序崩溃了.它可以在Android Nougat下运行,但在Android Nougat上它会崩溃.当我尝试从SD卡打开文件而不是从系统分区打开文件时,它只会崩溃.一些许可问题?
示例代码:
File file = new File("/storage/emulated/0/test.txt");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "text/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // Crashes on this line
Run Code Online (Sandbox Code Playgroud)
日志:
android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData()暴露在app之外
编辑:
在定位Android Nougat时,file://不再允许使用URI.我们应该使用content://URI代替.但是,我的应用程序需要打开根目录中的文件.有任何想法吗?
我在Android下载二进制文件问题 和以编程方式在Android上安装应用程序的帮助下做到了这一点 .
我想立即进行自动更新和自动安装.它是本地的,所以它是非市场应用.
这是我的代码:
public void Update(String apkurl){
try {
URL url = new URL(apkurl);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
String PATH = Environment.getExternalStorageDirectory() + "/download/";
File file = new File(PATH);
file.mkdirs();
File outputFile = new File(file, "app.apk");
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.close();
is.close();//till here, it works fine …Run Code Online (Sandbox Code Playgroud) 我知道res目录中的文件可以从R.class资产的行为类似文件系统访问,但我想知道,一般来说,最好使用其中一个.
任何人都可以帮助我了解资产和资产之间的真正差异吗?
我刚刚为Google Play商店编写了一款游戏,并希望提醒我的客户在应用程序市场上留下反馈(特别是演示版).有没有办法以一种模式启动市场意图,将用户带到页面的反馈/评论部分?
我已经使用这种方法将我的演示链接到付费应用程序......
Intent goToMarket = null;
goToMarket = new Intent(
Intent.ACTION_VIEW,
Uri.parse("market://details?id=com.paulmaidment.games.flagsoftheworld"));
startActivity(goToMarket);
Run Code Online (Sandbox Code Playgroud)
有最好的做法吗?
另外,有没有办法跟踪我的演示应用程序中的推荐,以便我可以尝试计算某种转换率?(也就是说,演示应用程序在产生销售方面的效果如何.)
今天Google云端硬盘应用询问我是否要安装新的应用表单和文档.
我已经接受了,希望它可以打开Google Play商店,这样我就可以按安装了.
它没有.它只显示了弹出窗口,其中包含每个应用程序的权限以确认安装,这与您在Play商店中的任何应用程序上按"安装"时显示的相同.
我不知道可以做到这一点.
我们如何在应用程序中重现此行为:有一个"安装App XPTO"按钮,不需要打开Google Play商店?只显示权限对话框并继续通过Play商店安装它?
更新:
对于那些低调的人,因为他们认为这与其他问题是一样的......事实并非如此!
在这种情况下,Google Drive应用程序不会下载APK,然后安装.Google云端硬盘" 告诉 "Play商店下载和安装.
那是我感兴趣的API.
为了支持我的案例:在按下INSIDE Google Drive以安装应用程序而不打开Play商店后,下载开始.在下载过程中,我打开了Play商店进行检查,并且:

屏幕截图证明,Google Drive不是下载APK并安装它.这是Play商店.
我正在开发一个库,允许应用程序自行更新,以便在Android Market之外分发.
我最初的计划是包含将APK文件下载到内部存储的代码,然后通过a ContentProvider和a 安装它content:// Uri.但是,当我尝试这样做时,安装程序系统向LogCat转储了一个"Skipping dir:"警告,但未能实际安装它.有一次,我切换到下载APK到外部存储和使用file:// Uri与ACTION_VIEW安装程序Intent,它的工作.
在"跳过目录"的消息似乎被记录parsePackage()在PackageParser,这似乎认为它正在与一个File.这表明我们不能使用content:// Uri价值观.
有没有人成功地使用ACTION_VIEW上application/vnd.android.package-archive Intent了content:// Uri?如果是这样,是否有一些特定的技巧来设置ContentProvider它使它工作?
谢谢!
我有android的系统级应用程序:sharedUserId ="android.uid.system"(UID:1000).
设备没有扎根!Manifest中包含INSTALL_PACKAGES权限.
我可以安静地安装下载的*.apk吗?
TL:DR; 版本;)
我的应用应该在没有用户交互的情况下运行(自动启动等工作)
它应该更新自己(通过apk),无需任何用户交互
有根设备是可能的
.
问题:
如何在没有任何用户交互的情况下解决此问题
http://code.google.com/p/auto-update-apk-client/ 这似乎是一个解决方案,但必须有更好的方法.
我已经找到了这个:在Android上以编程方式安装应用程序
但这并没有解决我的问题.
在不使用 Google Play 商店的情况下发布新版本时,如何实现应用程序的自动更新?我正在使用 JSON 来检查版本。
我正在构建一个托管在Google Play外部服务器上的Android应用.我需要应用程序检查新版本并提示用户在应用程序启动时进行更新.
我构建了一个机制来检查新版本(应用程序检查服务器上的文件并比较版本),该机制运行良好.然后我提示用户更新,但如果用户选择继续更新,我无法触发apk的下载和安装.
我试过打开apk url:
window.open(apkURL);
Run Code Online (Sandbox Code Playgroud)
其中apkURL是服务器上托管的.apk文件的完整http链接.
但它似乎没有做任何事情.
我一直在研究,但我找不到如何做到这一点的答案.我发现了一些使用本机代码的建议,比如这篇文章在Android上以编程方式安装应用程序,但我不知道如何在我的Phonegap应用程序中执行此操作.
Intent promptInstall = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("file:///path/to/your.apk"))
.setType("application/vnd.android.package-archive");
startActivity(promptInstall);
Run Code Online (Sandbox Code Playgroud)
这是触发更新的正确方法吗?如何在Phonegap应用程序中完成这样的事情?
谢谢!
我在 Play 商店之外有一个 Android 应用程序。它通过下载新的 APK 并使用 Intent 调用安装程序对话框来更新自身。更新功能在 Android 10 上不再起作用。
我现在需要在 Android 10 上使用 PackageInstaller API,但无法让它工作。我的应用程序不是设备或配置文件所有者,但由于我不想静默安装,所以我认为应该没问题。
我的问题是,一旦我提交会话,就绝对不会发生任何事情。
PackageInstaller installer = activity.PackageManager.PackageInstaller;
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
int sessionId = installer.CreateSession(sessionParams);
PackageInstaller.Session session = installer.OpenSession(sessionId);
var input = new FileStream(pfad, FileMode.Open, FileAccess.Read);
var packageInSession = session.OpenWrite("package", 0, -1);
input.CopyTo(packageInSession);
packageInSession.Close();
input.Close();
//That this is necessary could be a Xamarin bug.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Intent intent = new Intent(activity, activity.Class);
intent.SetAction("com.example.android.apis.content.SESSION_API_PACKAGE_INSTALLED");
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0);
IntentSender statusReceiver …Run Code Online (Sandbox Code Playgroud) 最近我要开展一个项目,其中的要求很奇怪.我被要求开发一个应用程序,不会上传到任何市场,如Playstore或任何其他Android应用程序商店.它将简单地上传到云端,以便在用户之间分发APK.
在用户设备上安装应用程序后,当发布新版本时,将通知用户(通知不下载新版本并重新安装,但授予权限和更新).在用户授予权限后,应用程序将会更新.没有市场帮助,最好的方法是什么?
我的想法:
有没有更明智的方法来实现我想要实现的目标?
我想从我的xamarin android应用程序的文件系统中安装一个第三方应用程序。我在Android 10之前成功使用的代码非常简单明了。
Intent intent = new Intent(Intent.ActionView);
Uri data = Uri.FromFile(file);
intent.SetDataAndType(data, "application/vnd.android.package-archive");
context.StartActivity(intent);
Run Code Online (Sandbox Code Playgroud)
由于ACTION_VIEW和ACTION_INSTALL_PACKAGE在Android 10中已弃用,因此该代码在Android 10上不起作用。看来我们现在需要使用PackageInstaller API。
我试图使用PackageInstaller API编写方法。不幸的是,它不起作用。
使用PackageInstaller API进行编码
public static void InstallPackageAndroidQAndAbove(Context context, string filePath, string packageName)
{
var packageInstaller = context.PackageManager.PackageInstaller;
var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
sessionParams.SetAppPackageName(packageName);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
var input = new FileStream(filePath, FileMode.Open, FileAccess.Read);
var output = session.OpenWrite(packageName, 0, -1);
input.CopyTo(output);
output.Close();
input.Close();
input.Dispose();
session.Fsync(output);
var pendingIntent = PendingIntent.GetBroadcast(context, sessionId, new Intent(Intent.ActionInstallPackage), 0);
session.Commit(pendingIntent.IntentSender);
}
Run Code Online (Sandbox Code Playgroud)
呼叫期间发生异常“无法识别的流”。 …
android apk xamarin.android android-install-apk android-10.0
android ×12
apk ×3
android-10.0 ×1
android-file ×1
auto-update ×1
cordova ×1
dart ×1
flutter ×1
google-play ×1
install ×1
installation ×1
package ×1
updating ×1
xamarin ×1