2013-07-22 12 views
12

Android uygulamamın dosyaların genişletilmiş kullanıcı özniteliklerini alıp ayarlamasının bir yolu var mı? Android üzerinde java.nio.file.Files kullanmanın bir yolu var mı? Dalvik uygulamasından setfattr ve getfattr'u kullanmanın bir yolu var mı? Android'in ext4 dosya sistemini kullandığını biliyorum, bu yüzden mümkün olabileceğini düşünüyorum. Baska öneri?Android dosyalarında genişletilmiş kullanıcı özelliklerini nasıl belirlerim?

cevap

12

Android Java kitaplığı ve biyonik C kitaplığı bunu desteklemiyor. Yani bunun için Linux syscalls ile yerel kod kullanmalısınız.

Başlamak için Android 4.2 ve Android 4.4 sürümlerinde test edilecek bazı örnek kodlar.

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

Bu sdcardfs dosya sistemini veya diğer çekirdek kullanır (taklit) harici depolama üzerine dahili depolama çalışıyor ancak

#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 symlinks ve extended öznitelikleri gibi FAT dosya sistemi tarafından desteklenmeyen özellikleri devre dışı bırakmak için işlevler. Muhtemelen bunu yaparlar çünkü harici bir bilgisayara aygıt bağlanarak erişilebilmektedir ve kullanıcılar dosyaları kopyalayıp ileri geri almayı beklemektedir.

Yani bu işler: Bu süre

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

hata mesajı ile IOException atar: "Operasyon taşıma uç noktası üzerinde desteklenmez":

File externalStorageFile = new File(getExternalFilesDir(null),"test"); 
externalStorageFile.createNewFile(); 
XAttrNative.setxattr(externalStorageFile.getPath(), "user.testkey", "testvalue"); 
+0

neden ikinci bir istisna atar? – Blackbelt

+0

Google, FAT tarafından desteklenen harici bir depolama üzerinde çalışmak üzere desteklenen herhangi bir işlev istemediğinden - öykünmeli veya değil. Bu symlinks, genişletilmiş öznitelikleri içerir ... Bunlar sdcardfs ve diğer çekirdek işlevselliği ile zorlar. Muhtemelen bunu yaparlar çünkü harici bir bilgisayara aygıt bağlanarak erişilebilmektedir ve kullanıcılar dosyaları kopyalayıp ileri geri almayı beklemektedir. –

+0

aslında bu sizin cevabınızın bir parçası olmalı – Blackbelt