SAF-lastModified()值未反映对云存储上文件夹的修改

我创建了一个测试Android应用程序,以通知有关使用Storage access Framework创建的文件夹的更新。

应用程序通过SAF选择器创建文件夹。

用户创建文件夹后,uri用于创建DocumentFile对象。

然后每2秒要求lastModified()方法输入一个长整数,该整数是时间戳。

记录该号码,以便我查看修改文件夹的时间。

当我在设备存储上创建文件夹时,应用会正确记录修改事件,例如创建子文件夹,将文件复制到主文件夹等等。

仅当文件夹内发生某些事情时,此功能才起作用,而不是子文件夹。但是我对这种修改水平不感兴趣。我只需要知道主文件夹中什么时候发生。

但是,当我对在云存储上创建的SAF文件夹执行相同的操作(用户可以访问云根目录,然后在那儿创建文件夹)时,不会记录修改。

也就是说,lastModified()方法不会产生更新的值。我每次都会得到相同的原始值。

我的代码有什么问题?我是否必须刷新某些内容或首先调用其他方法?

这是应用代码:

package com.example.safevents;

import android.app.activity;
...
... //other imports

public class Mainactivity extends AppCompatactivity {
activity activity;
private ScheduledExecutorService scheduletaskExecutor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportactionBar(toolbar);
    activity=this;
    FloatingactionButton fab = findViewById(R.id.fab);
    fab.setOnClicklistener(new View.OnClicklistener() {
        @Override
        public void onClick(View view) {
            snackbar.make(view,"Replace with your own action",snackbar.LENGTH_LONG)
                    .setaction("action",null).show();
            openPickerForFolderCreation(activity,0);
        }
    });
}

@Override
protected void onDestroy()
{
    super.onDestroy();

}

@Override
protected void onactivityResult(int requestCode,int resultCode,Intent returnedIntent)
{
Log.d("SAF","picker returned "+resultCode+" "+requestCode);
if (returnedIntent!=null) {
Log.d("SAF","intent=" + returnedIntent.toString());
if (returnedIntent.getData() != null)
    Log.d("SAF","uri=" + returnedIntent.getData().toString());
if (resultCode == -1)
    if (requestCode == 0) {

        Uri uri = takePermanentReadWritePermissions(activity,returnedIntent.getData(),returnedIntent.getflags());

        Log.d("SAF","uri=" + uri.toString());
        Log.d("SAF","read/write permissions=" + arePermissionsGranted(activity,uri.toString()));



        final DocumentFile df = DocumentFile.fromSingleUri(activity,uri);
        SAFEvents.getInstance().mainFolder = df;


        scheduletaskExecutor = Executors.newScheduledThreadPool(5);


        scheduletaskExecutor.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {


                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        Log.d("folder modified",String.valueOf(df.lastModified()));
                    }
                });

            }
        },2,TimeUnit.SECONDS);

    }
 }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button,so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
 }
}

以下是一些方法:

public void openPickerForFolderCreation(activity activity,int requestCode) {

    Intent intent = new Intent(Intent.actION_CREATE_DOCUMENT);
    intent.setType("vnd.android.document/directory");
    intent.addflags(Intent.flaG_GRANT_PERSISTABLE_URI_PERMISSION);
    intent.addflags(Intent.flaG_GRANT_READ_URI_PERMISSION);
    intent.addflags(Intent.flaG_GRANT_WRITE_URI_PERMISSION);
    activity.startactivityForResult(intent,requestCode);
}

    public boolean arePermissionsGranted(activity activity,String uriString) {

    Uri uri = Uri.parse(uriString);


    ContentResolver resolver = activity.getcontentResolver();
    List<UriPermission> list = resolver.getPersistedUriPermissions();
    for (int i = 0; i < list.size(); i++) {
    Log.d("SAF","checking permissions of "+list.get(i).geturi().toString());
        if (((Uri.decode(list.get(i).geturi().toString())).equals(Uri.decode(uriString))) && list.get(i).isWritePermission() && list.get(i).isReadPermission()) {
            return true;
        }


    }

    return false;
}

public Uri takePermanentReadWritePermissions(activity activity,Uri uri,int flags) {
    int takeflags = flags
            &
            (Intent.flaG_GRANT_READ_URI_PERMISSION | Intent.flaG_GRANT_WRITE_URI_PERMISSION
            );




    ContentResolver resolver = activity.getcontentResolver();
    resolver.takePersistableUriPermission(uri,takeflags);

    return uri;

}

如果有必要,单例用于保留参考

package com.example.safevents;

import androidx.documentfile.provider.DocumentFile;

public class SAFEvents {
private static final SAFEvents ourInstance = new SAFEvents();

DocumentFile mainFolder;

public static SAFEvents getInstance() {
    return ourInstance;
}

private SAFEvents() {
}
}
xbl_lkz 回答:SAF-lastModified()值未反映对云存储上文件夹的修改

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3110887.html

大家都在问