从BroadcastReceiver访问外部存储

时间:2013-11-04 16:15:04

标签: android broadcastreceiver

我有一个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是否停止访问文件?

2 个答案:

答案 0 :(得分:0)

一种好的方法是从BroadcastReceiver启动一个新的服务来处理你想要执行的任务。

其他事项:

  1. 确保您已在manifest.xml中声明了接收器

  2. 此外,您还需要考虑以下内容。

  3.   

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

         

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

答案 1 :(得分:0)

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

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