2013-11-04 3 views
-1

외부 저장소 영역에있는 파일의 존재 여부를 테스트해야하는 BroadcastReceiver (Android 4.1)가 있습니다. 수신자는 파일을 읽거나 쓸 필요가 없습니다. 그것의 존재를 시험하기 만하면됩니다.BroadcastReceiver에서 외부 저장소에 액세스

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

BroadcastReceivers가 파일에 액세스하지 못하도록합니까?

+0

매니페스트에 어떤 권한이 있습니까? – Flynn81

+0

@ Flynn81 브로드 캐스트 인 텐트에 대해 RECEIVE_BOOT_COMPLETED 및 매니페스트에 선언 된 READ_EXTERNAL_STORAGE 사용 권한이 있습니다. – adelphus

답변

0

수행하려는 작업을 처리하기 위해 BroadcastReceiver에서 새로운 서비스를 시작하는 것이 좋습니다.

다른 것들 :

  1. 이 있는지 확인하십시오 당신은

  2. 은 또한 당신이뿐만 아니라 다음과 같은 고려할 필요가 manifest.xml에 수신기를 선언했다. 안드로이드 3.1 기본적으로 해당 응용 프로그램이 사용자에 의해 시작되거나 적이있는 경우 의도을받는 모든 브로드 캐스트 리시버를 제외됩니다 안드로이드 시스템으로

사용자가 명시 적으로 (안드로이드 메뉴를 통해 응용 프로그램을 중지하는 경우 응용 프로그램 관리).

사용자가 시작한 응용 프로그램 만 브로드 캐스트 인 텐트를 수신 할 수 있음을 확신 할 수 있기 때문에 추가적인 보안 기능입니다.

0

내 시스템 앱 (내 앱)이 외부 저장소에 저장된 파일에 액세스하지 못한다는 것을 결국 발견했습니다.

BroadcastReceiver를 다른 (시스템이 아닌) APK로 이동하면 문제가 해결되었습니다.

+0

출처가 있습니까? 이것은 나에게 전혀 어울리지 않는 것 같습니다. 나는 당신이 당시 사용했던 AOSP의 버전이 무엇인지, 그리고 어떤 오류가 있는지 궁금합니다. –

관련 문제