-1

我有一个 BroadcastReceiver (Android 4.1),它必须测试是否存在位于外部存储区域的文件。接收方不需要读取或写入文件;只是测试它的存在。

我在 Android 文档中没有发现任何表明 BroadcastReceivers 无法访问外部文件的内容,但下面的代码始终返回 false。

logcat 输出显示 getExternalStorageState() 返回“mounted”,我可以使用普通 App 访问该文件,只是不能在 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 是否停止访问文件?

4

2 回答 2

0

一个好的方法是从 BroadcastReceiver 启动一个新服务来处理您希望执行的任务。

其他事情:

  1. 确保你已经在 manifest.xml 中声明了接收者

  2. 此外,您还需要考虑以下事项。

从 Android 3.1 开始,如果用户从未启动过相应的应用程序,或者如果用户通过 Android 菜单(在管理应用程序中)明确停止了应用程序,Android 系统将默认从接收意图中排除所有 BroadcastReceiver。

这是一个额外的安全功能,因为用户可以确定只有他启动的应用程序才会接收广播意图。

于 2013-11-04T16:49:45.677 回答
0

我最终发现系统应用程序(我的应用程序是)无法访问存储在外部存储上的文件。

将我的 BroadcastReceiver 移动到另一个(非系统)APK 解决了这个问题。

于 2013-11-05T15:35:06.270 回答