Android 从广播接收器访问外部存储器

Android 从广播接收器访问外部存储器,android,broadcastreceiver,Android,Broadcastreceiver,我有一个BroadcastReceiver(Android 4.1),它必须测试外部存储区域中是否存在文件。接收器不需要读取或写入文件;只是测试它的存在 我在Android文档中没有发现任何表明BroadcastReceivers无法访问外部文件的内容,但是下面的代码总是返回false logcat输出显示getExternalStorageState()返回“mounted”,我可以使用普通的应用程序访问该文件,而不是在接收器中。没有抛出异常 public class FileCheckRec

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

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

logcat输出显示getExternalStorageState()返回“mounted”,我可以使用普通的应用程序访问该文件,而不是在接收器中。没有抛出异常

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;
    }
}

BroadcastReceiver是否停止访问文件?

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

其他事项:

  • 确保已在manifest.xml中声明了接收方

  • >P>你也需要考虑下面的内容:

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

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


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


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

    您的清单中有哪些权限?@Flynn81我已完成接收启动(出于广播目的)并在清单中声明读取外部存储权限。您有此权限的来源吗?我觉得这一点都不对。我很好奇你当时使用的是什么版本的AOSP,以及你犯了什么错误。