2013-07-22 12 views
12

私のアンドロイドアプリがファイルの拡張ユーザー属性を取得して設定する方法はありますか?アンドロイドにjava.nio.file.Filesを使用する方法はありますか?私のdalvikアプリからsetfattrgetfattrを使用する方法はありますか?私はアンドロイドがext4ファイルシステムを使用していることを知っているので、それは可能であるはずです。助言がありますか?アンドロイドファイルに拡張ユーザー属性を設定するにはどうすればよいですか?

答えて

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をスローしながら:秒1つが例外をスローした理由

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

:「操作トランスポートエンドポイントでサポートされていませんか」? – Blackbelt

+0

Googleは、FATでサポートされている機能を超えて、エミュレートされているかどうかにかかわらず、外部ストレージで機能することを望んでいないためです。これにはシンボリックリンク、拡張属性などが含まれています。これはsdcardfsや他のカーネル機能でこれを強制します。デバイスをPCに接続して外部ストレージにアクセスすることができ、ユーザーがファイルを前後にコピーするとすべての情報が保持されることが予想されるため、これはおそらく、これを行うものです。 –

+0

実際これはあなたの答えの一部でなければなりません – Blackbelt

関連する問題