2013-11-04 158 views
-1

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

我还没有在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

你在清单中拥有什么权限? – Flynn81

+0

@ Flynn81我在清单中声明了RECEIVE_BOOT_COMPLETED(用于广播意图)和READ_EXTERNAL_STORAGE权限。 – adelphus

回答

0

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

其他的事情:

  1. 确保已宣布的manifest.xml

  2. 还需要考虑以下以及接收器。

随着安卓3.1的Android系统将默认排除所有广播接收器后,如果相应的应用程序从未被用户或开始接受意向,如果用户明确停止通过Android菜单的应用程序(在管理应用程序)。

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

0

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

将我的BroadcastReceiver移动到另一个(非系统)APK固定的问题。

+0

你有这方面的来源吗?这对我来说看起来不太合适。我很好奇当时你使用的是什么版本的AOSP,以及你得到了什么错误。 –