2013-07-22 5 views
12

내 Android 앱이 파일의 확장 된 사용자 속성을 검색하고 설정하는 방법이 있습니까? 안드로이드에 java.nio.file.Files을 사용할 수있는 방법이 있습니까? 내 dalvik 응용 프로그램에서 setfattrgetfattr을 사용할 수 있습니까? 나는 안드로이드가 ext4 파일 시스템을 사용한다는 것을 알고 있으므로 가능한 것이어야한다. 어떤 제안?어떻게 확장 사용자 속성을 android 파일에 설정합니까?

답변

12

Android Java 라이브러리와 Bionic C 라이브러리는이를 지원하지 않습니다. 따라서 Linux syscalls를 사용하여 원시 코드를 사용해야합니다.

다음은 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; 
} 

이것은 sdcardfs 파일 시스템 또는 다른 커널을 사용 (에뮬레이트) 외부 저장소가 내부 저장에 잘 작동하지만

#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); 
} 

xattr.c 심볼릭 링크 및 확장 된 속성과 같은 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"); 
+0

왜 두 번째 예외를 throw? – Blackbelt

+0

Google은 FAT에서 지원하는 기능 외에 외부 저장 장치에서 작동하는 기능을 원하지 않으므로 에뮬레이션을 사용하거나 사용하지 않습니다. 그것은 심볼릭 링크, 확장 된 속성을 포함합니다 ... 그들은 sdcardfs와 다른 커널 기능으로이를 시행합니다. 컴퓨터를 장치에 연결하여 외부 저장소에 액세스 할 수 있고 사용자가 파일을 앞뒤로 복사하면 모든 정보가 보존되기 때문에 외부 장치가 PC에 연결되어 있기 때문에 가능하다고 생각할 수 있습니다. –

+0

실제로 이것은 당신의 대답의 일부분이어야합니다 – Blackbelt

관련 문제