15

有没有办法让我的 android 应用程序检索和设置文件的扩展用户属性?有没有办法java.nio.file.Files在安卓上使用?有什么方法可以使用setfattrgetfattr来自我的 dalvik 应用程序吗?我知道android使用ext4文件系统,所以我想应该是可能的。有什么建议么?

4

1 回答 1

12

Android Java 库和仿生 C 库不支持。因此,您必须为此使用带有 Linux 系统调用的本机代码。

下面是一些示例代码,可帮助您入门,并在 Android 4.2 和 Android 4.4 上进行了测试。

XAttrNative.java

package com.appfour.example;

import java.io.IOException;

public class XAttrNative {
    static {
        System.loadLibrary("xattr");
    }

    public static native void setxattr(String path, String key, String value) throws IOException;
}

xattr.c

#include <string.h>
#include <jni.h>
#include <asm/unistd.h>
#include <errno.h>

void Java_com_appfour_example_XAttrNative_setxattr(JNIEnv* env, jclass clazz,
        jstring path, jstring key, jstring value) {
    char* pathChars = (*env)->GetStringUTFChars(env, path, NULL);
    char* keyChars = (*env)->GetStringUTFChars(env, key, NULL);
    char* valueChars = (*env)->GetStringUTFChars(env, value, NULL);

    int res = syscall(__NR_setxattr, pathChars, keyChars, valueChars,
            strlen(valueChars), 0);

    if (res != 0) {
        jclass exClass = (*env)->FindClass(env, "java/io/IOException");
        (*env)->ThrowNew(env, exClass, strerror(errno));
    }

    (*env)->ReleaseStringUTFChars(env, path, pathChars);
    (*env)->ReleaseStringUTFChars(env, key, keyChars);
    (*env)->ReleaseStringUTFChars(env, value, valueChars);
}

这适用于内部存储,但不适用于使用 sdcardfs 文件系统或其他内核功能来禁用 FAT 文件系统不支持的功能(例如符号链接和扩展属性)的(模拟)外部存储。可以说他们这样做是因为可以通过将设备连接到 PC 来访问外部存储,并且用户希望来回复制文件可以保留所有信息。

所以这有效:

File dataFile = new File(getFilesDir(),"test");
dataFile.createNewFile();
XAttrNative.setxattr(dataFile.getPath(), "user.testkey", "testvalue");

虽然这会引发IOException错误消息:“传输端点不支持操作”:

File externalStorageFile = new File(getExternalFilesDir(null),"test");
externalStorageFile.createNewFile();
XAttrNative.setxattr(externalStorageFile.getPath(), "user.testkey", "testvalue");
于 2014-06-24T09:41:15.590 回答