对于在片状移动互联网连接上具有大量后台下载的应用程序,DownloadManager似乎是正确的选择.
使用网络上的教程代码,该应用程序可以从系统的DM请求下载,如下所示:
// in onCreate()
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
// in requestData()
Uri u = Uri.parse("http://server:8000/feed/data");
Request dreq = new Request(u);
dreq.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
downloadID = dm.enqueue(dreq);
Run Code Online (Sandbox Code Playgroud)
该代码中的URL是本地计算机上的测试服务器.URL工作,Android模拟器中的浏览器可以检索页面,当我的应用程序通过DownloadManager和上面引用的代码请求该页面时,服务器返回HTTP代码200.
这是ACTION_DOWNLOAD_COMPLETE BroadcastReceiver中的相关代码,当DM检索到文件时,它会被调用.
Query q = new Query();
q.setFilterById(downloadID);
Log.i("handleData()", "Handling data");
Cursor c = dm.query(q);
if (c.moveToFirst()) {
Log.i("handleData()", "Download ID: " + downloadID + " / " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_ID)));
Log.i("handleData()", "Download Status: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)));
if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Log.i("handleData()", "Download URI: " + uriString);
} else if …Run Code Online (Sandbox Code Playgroud) 我正在写一个小应用程序来播放音乐.我的目标是Android API等级7及以上.
应用程序应该仅列出和播放已经由用户通过偏好选择的特定类型集合标记的音乐,例如"Pop","Rock","Hillbilly".
现在我正试图找到一种有效的方法来查找包含用所选流派标记的曲目的所有专辑ID和专辑名称.
这在SQL中很容易.手机将媒体元数据存储在sqlite数据库中.我在手机的内部存储器中找到它,通过adb复制它并尝试了一些sqlite查询.生成的查询是一个带有连接链的SQL一行,它工作正常.
在使用Android SDK的Java中,这似乎更难,至少在API等级7及以上.我可以在MediaStore上使用managedQuery在同一个底层数据库上执行一些有限的SQL语法,但是如果我理解正确的话,那么在使用这个API时就没有JOIN和DISTINCT.
我也可能忽略了这一点,但MediaStore允许我搜索一种类型的所有曲目,但不能搜索单个查询中几种类型的所有曲目.
所以这一切都在java中获得了一些手动工作.该程序现在必须为每个类型执行几个managedQuery()调用,并且程序必须加入结果并使它们与sqlite(此工作所属的)之外的java不同.
这真的是必须要做的吗?有没有办法只是将原始查询发送到sqlite数据库文件?
谢谢!
我们的Android应用程序生成一个logcat shell进程,然后读取其结果进行处理.但是,当应用程序停止时(例如,在开发期间重新编译后重新启动时),logcat进程将继续运行.以下是此行为的示例:
processes = new ArrayList<Process>();
try {
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
} catch (IOException e) {
// oh no!
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
for (Process p : processes) {
p.destroy();
}
};
});
Run Code Online (Sandbox Code Playgroud)
将其添加到测试应用程序的onCreate()方法,启动它,然后使用设置管理器强制停止它.子进程将继续运行,现在父进程为1.
在如何杀死Android应用程序启动的logcat进程?有人建议使用ProcessBuilder,但这不是一个解决方案,而且该过程也会继续运行.
在父进程停止的Stop子进程中,它被建议使用一个关闭钩子 - 这不起作用,如上所示.
谢谢!
我写了一个小的Android应用程序.它在Google Play上发布为两个不同的版本
现在我想要在他的设备上预安装我的应用程序的平板电脑的经销商.显然,我希望他的产品的所有者能够从我的应用程序的更新版本中受益.
有没有办法在设备上预先安装付费应用程序,仍然允许免费更新应用程序?
谢谢!