-1

外部ストレージ領域にあるファイルの存在をテストする必要がある BroadcastReceiver (Android 4.1) があります。受信者はファイルを読み書きする必要はありません。その存在をテストするだけです。

BroadcastReceivers が外部ファイルにアクセスできないことを示す Android ドキュメントには何も見つかりませんでしたが、以下のコードは常に false を返します。

logcat の出力は、getExternalStorageState() が「mounted」を返すことを示しており、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 に答える