15

Android アプリでファイルの拡張ユーザー属性を取得して設定する方法はありますか? java.nio.file.FilesAndroidで使用する方法はありますか?私のdalvikアプリから使用する方法はありますsetfattrか ? getfattrAndroidがext4ファイルシステムを使用していることは知っているので、可能だと思います。助言がありますか?

4

1 に答える 1

12

Android Java ライブラリと bionic 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 に答える