我有一个BroadcastReceiver(Android 4.1),它必须测试是否存在位于外部存储区域的文件。接收器不需要读取或写入文件;只是测试它的存在。
我在Android文档中没有找到任何表明BroadcastReceivers无法访问外部文件的内容,但下面的代码总是返回false。
logcat输出显示getExternalStorageState()返回“已挂载”,我可以使用普通应用程序访问该文件,而不是在Receiver中。没有例外被抛出。
public class FileCheckReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
boolean b = checkFile();
Log.d(TAG, "FileCheckReceiver: " + b);
}
boolean checkFile() {
String state = Environment.getExternalStorageState();
Log.d(TAG, "FileCheckReceiver, Environment.getExternalStorageState: " + state);
String name = "file.txt";
File f = new File(Environment.getExternalStorageDirectory() + "/" + name);
try
{
if (f.exists()) {
System.out.println(f.getCanonicalPath().toString());
return true;
}
}catch(Exception e) {
e.printStackTrace();
}
return false;
}
}
BroadcastReceivers是否停止访问文件?
答案 0 :(得分:0)
一种好的方法是从BroadcastReceiver启动一个新的服务来处理你想要执行的任务。
其他事项:
确保您已在manifest.xml中声明了接收器
此外,您还需要考虑以下内容。
从Android 3.1开始,如果相应的应用程序从未被用户启动过,或者用户通过Android菜单明确停止了应用程序(在管理应用程序中),Android系统将默认排除所有BroadcastReceiver接收意图。
这是一个额外的安全功能,因为用户可以确保只有他启动的应用程序才会收到广播意图。
答案 1 :(得分:0)
我最终发现系统应用程序(我的应用程序是)无法访问存储在外部存储上的文件。
将我的BroadcastReceiver移动到另一个(非系统)APK修复了问题。