【问题标题】:File observer not working in android 10 and higher文件观察器在 android 10 及更高版本中不起作用
【发布时间】:2021-02-20 13:12:29
【问题描述】:

我的要求是即使应用程序没有在后台运行,也要观察用户的文件之一,所以我创建了一个前台服务(既方便又好用)并将文件观察器代码放入其中,当然,我处理了以下警告

警告:如果FileObserver 被垃圾回收,它将停止发送 事件。为确保您继续接收事件,您必须保留参考 从其他活动对象到 FileObserver 实例。

通过将FileObserver 变量放在App.class

它在 android 9 上运行良好,正如预期的那样,但是当我在 android 10 上尝试我的应用程序时,我可以看到前台服务正在运行,但是只要观察到的文件被修改,就不会触发任何事件

我从 android 10 中阅读了对 java.io.file 的一些新限制,但我无法获得我想要的结果。

是否有任何方法或替代方法可以解决此错误?

代码

private void startObserving() {
        fileObserver = new FileObserver(utilityClass.GET_X_FOLDER().getPath(), FileObserver.ALL_EVENTS) {
            @Override
            public void onEvent(int event, @Nullable String path) {
                if (event == FileObserver.CREATE) {
                    start(path);
                }
            }
        };
        fileObserver.startWatching();
    }

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ss_app">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:logo="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".Help" />
        <activity android:name=".developer"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".AlaramReceiver" />
        <receiver android:name=".BootBroadCastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service android:name=".FileDeleteService" />
        <service android:name=".ForeGroundService" />
        <service android:name=".xService" />
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="xxxx"/>
    </application>

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

</manifest>

【问题讨论】:

  • stackOverflow 中有一个聊天功能,但我似乎无法使用它。无论如何,我刚刚在 Android 10 上进行了另一次测试,它正在运行。我必须在 manifest.xml 文件的 标记下添加行 * android:requestLegacyExternalStorage="true"*。检查它是否正常工作
  • 谢谢你呜呜呜呜呜男孩。你有我的生活@DanBaruch 添加你说的那一行。一切正常。只是谢谢你。现在,如果你不是我的,我将成为你的朋友,我的意思是在任何社交网络上,你有任何
  • 我明白了哈哈,那样的话,只要你需要,就在这里打我。我会删除我的其他 cmets 以防止这个时间太长
  • 我也会@DanBaruch
  • 嘿@DanBaruch 我又需要你stackoverflow.com/q/65263749/14599955

标签: java android file android-10.0


【解决方案1】:

解决方案:只需在清单中的应用程序标记下添加以下行

 android:requestLegacyExternalStorage="true"

【讨论】:

  • 是的,它对我有用,但不适用于 android 11。
  • android 11 的任何解决方案?
  • 还没有,如果你发现了,请在这里告诉我。
  • 为我工作!!谢谢!
  • 但它只能在 android 10 中工作,对于 android 11,您需要请求读取和写入文件的权限,您可以在 google 上找到。但是,您还必须在发布您的应用程序时给出一个玩商店的理由,说明您需要该权限的原因。而且他们通常不同意开发人员的声明和需要
【解决方案2】:

如果您没有在应用中动态请求它,请务必进入 Settings->Apps->YourApp 并授予存储权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2023-03-13
    • 1970-01-01
    • 2014-05-07
    • 2018-09-29
    相关资源
    最近更新 更多