2010-01-23 17 views
73

Chciałbym, aby moja aplikacja archiwizowała aplikację DB na karcie SD. W moim kodzie sprawdzam, czy istnieje katalog canWrite(), a jeśli nie, wyrzuć IOException. W tym konkretnym przypadku próbuję skopiować plik db do katalogu głównego na karcie SD, ale program rzuca IOException. Jak mogę zmienić uprawnienia do folderu/pliku, aby móc do niego pisać?Pozwolenie na zapis na karcie SD

Odpowiedz

201

Masz rację, że katalog kart SD to /sdcard, ale nie powinieneś go kodować. Zamiast zadzwonić do Environment.getExternalStorageDirectory() aby uzyskać katalogu:

File sdDir = Environment.getExternalStorageDirectory(); 

Jeżeli nie zostało to zrobione, trzeba będzie podać prawidłową aplikacja zgodę na zapis na karcie SD dodając linię poniżej Twój Manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Dzięki ... będę zmiana kodu zgodnie z sugestią. Jednak obecnie mam go mocno zakodowany i nie mam uprawnień ustawionych w pliku manifestu, ale pozwala mi to zachować go na karcie SD. dlaczego mogę go zapisać bez zestawu uprawnień? – bugzy

+4

@ user244190 - zgaduję, że Twój telefon ma system Android 1.5. 'WRITE_EXTERNAL_STORAGE' został wprowadzony w wersji 1.6, więc musisz go dołączyć do swojej aplikacji, jeśli chcesz, aby był zgodny z formatem forward. –

+0

gotcha. dzięki ... – bugzy

1

Sugerowana technika powyżej w odpowiedzi Dave'a pewnością jest to dobra praktyka projektowania i tak ostatecznie wymagana zgoda musi być ustawiona w pliku AndroidManifest.xml aby uzyskać dostęp do pamięci zewnętrznej.

Jednak Mono-esque sposób dodawania większości (jeśli nie wszystkich, nie pewnych) "opcji manifestu" to atrybuty klasy implementującej działanie (lub usługę).

Wtyczka Visual Studio Mono automatycznie generuje manifest, więc najlepiej go nie manipulować ręcznie (jestem pewien, że są przypadki, w których nie ma innej opcji).

Na przykład:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")] 
public class MonoActivity : Activity 
{ 
    protected override void OnCreate(Bundle bindle) 
    { 
    base.OnCreate(bindle); 
    } 
} 
+0

Obecnie widzę, że to ustawienie WRITE_EXTERNAL_STORAGE jest uprawnieniem użytkownika i jeśli ustawione tak, jak powyżej, pojawi się jako ustawienie aktywności (Android: uprawnienie), a nie uprawnienia użytkownika w pliku manifestu. Och, właśnie sobie przypomniałem, ustawiłeś użytkownika uprawnień użytkownika na właściwości projektu w VS (jest to lista wyboru wszystkich uprawnień). – samosaris

+1

W rzeczywistości są to znaczniki "use-permission", a nie "user-permission", ale poza tym wszystko inne jest prawdziwe. – samosaris

+0

Jedna rzecz absolutnie niezbędna to wywołanie , jeśli (Build.VERSION.SDK_INT> = 19) { MainActivity.get(). GetExternalFilesDirs (null); } // Aby uzyskać dostęp do SD/Android/data/your.package.name // Nie próbuj samodzielnie tworzyć pakietu. Niewykonanie tego połączenia powoduje, że mkdir lub mkdirs nie działają. – user2607942

Powiązane problemy