2013-07-22 6 views
12

क्या मेरे एंड्रॉइड ऐप को पुनर्प्राप्त करने और फ़ाइलों के विस्तारित उपयोगकर्ता विशेषताओं को सेट करने का कोई तरीका है? एंड्रॉइड पर java.nio.file.Files का उपयोग करने का कोई तरीका है? क्या मेरे dalvik ऐप से setfattr और getfattr का उपयोग करने का कोई तरीका है? मुझे पता है कि एंड्रॉइड ext4 फाइल सिस्टम का उपयोग करता है, इसलिए मुझे लगता है कि यह संभव होना चाहिए। कोई सुझाव?मैं एंड्रॉइड फ़ाइलों पर विस्तारित उपयोगकर्ता विशेषताओं को कैसे सेट करूं?

उत्तर

12

एंड्रॉइड जावा लाइब्रेरी और बायोनिक सी लाइब्रेरी इसका समर्थन नहीं करती है। तो आपको इसके लिए लिनक्स सिस्कोल के साथ देशी कोड का उपयोग करना होगा।

एंड्रॉइड 4.2 और एंड्रॉइड 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 फाइल सिस्टम या अन्य कर्नेल का उपयोग करता है आंतरिक मेमोरी में ठीक काम करता है, लेकिन नहीं सुविधाओं को अक्षम करने के लिए फ़ंक्शन फ़ैट फ़ाइल सिस्टम जैसे सिम्लिंक और विस्तारित विशेषताओं द्वारा समर्थित नहीं हैं। तर्कसंगत रूप से वे ऐसा इसलिए करते हैं क्योंकि डिवाइस को किसी पीसी से कनेक्ट करके बाह्य संग्रहण का उपयोग किया जा सकता है और उपयोगकर्ताओं को उम्मीद है कि फ़ाइलों को प्रतिलिपि बनाने से सभी जानकारी सुरक्षित रहती है।

तो यह काम करता है:

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

क्यों दूसरा एक एक अपवाद फेंकता है? – Blackbelt

+0

क्योंकि Google बाहरी कार्यक्षमता पर काम करने के लिए एफएटी द्वारा समर्थित किसी भी कार्यक्षमता को नहीं चाहता है - नकली या नहीं। इसमें सिम्लिंक, विस्तारित गुण शामिल हैं, ... वे इसे sdcardfs और अन्य कर्नेल कार्यक्षमता के साथ लागू करते हैं। तर्कसंगत रूप से वे ऐसा इसलिए करते हैं क्योंकि डिवाइस को किसी पीसी से कनेक्ट करके बाह्य संग्रहण का उपयोग किया जा सकता है और उपयोगकर्ताओं को उम्मीद है कि फ़ाइलों को प्रतिलिपि बनाने से सभी जानकारी सुरक्षित रहती है। –

+0

अच्छी तरह से यह वास्तव में आपके उत्तर का हिस्सा होना चाहिए – Blackbelt

संबंधित मुद्दे

 संबंधित मुद्दे