Zezwolenie na zapis na karcie SD

80

Chciałbym, aby moja aplikacja zarchiwizowała bazę danych aplikacji na karcie SD. W moim kodzie sprawdzam, czy katalog canWrite()istnieje, a jeśli nie, wrzucam plik IOException. W tym konkretnym przypadku próbuję skopiować plik db do katalogu głównego na karcie SD, ale rzuca plik IOException. Jak mogę zmienić uprawnienia do folderu / pliku, aby móc w nim zapisywać?

bugzy
źródło

Odpowiedzi:

209

Masz rację, że katalog karty SD jest, /sdcardale nie powinieneś go mocno kodować. Zamiast tego zadzwoń pod numer, Environment.getExternalStorageDirectory()aby uzyskać katalog:

File sdDir = Environment.getExternalStorageDirectory();

Jeśli jeszcze tego nie zrobiłeś, musisz nadać swojej aplikacji odpowiednie uprawnienia do zapisu na karcie SD, dodając poniższy wiersz do swojego manifestu:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Dave Webb
źródło
Dzięki ... Zmienię kod zgodnie z twoją sugestią. Jednak obecnie mam to zakodowane na stałe i nie mam uprawnień ustawionych w pliku manifestu, ale i tak pozwala mi to zapisać na karcie SD. dlaczego mogę to zapisać bez nadania uprawnień?
bugzy
4
@ user244190 - przypuszczam, że Twój telefon ma Androida 1.5. WRITE_EXTERNAL_STORAGEzostał wprowadzony w wersji 1.6, więc jeśli chcesz, aby był zgodny z przyszłością, musisz go uwzględnić w swojej aplikacji.
Dave Webb
@DaveWebb: zobacz moje pytanie tutaj: stackoverflow.com/questions/9351904/…
Saher Ahwal
Nikt nie odpowiedział i nie wiem, dlaczego to nie działa.
Saher Ahwal,
@DaveWebb - słuszny pomysł, ale prawdopodobnie nie chodzi o to, że telefon działa w wersji 1.5, ale raczej o to, że aplikacja określa, że ​​został zbudowany pod kątem 1.5 lub (częściej) w ogóle nie określa wersji, a kiedy nowszy telefon widzi, że dodaje zezwolenie na kompatybilność wsteczną.
Chris Stratton,
1

Zasugerowana powyżej technika w odpowiedzi Dave'a jest z pewnością dobrą praktyką projektową i tak, ostatecznie wymagane uprawnienia muszą być ustawione w pliku AndroidManifest.xml, aby uzyskać dostęp do pamięci zewnętrznej.

Jednak większość (jeśli nie wszystkie, nie wiem) "opcji manifestu" można dodać w mono-sposób poprzez atrybuty klasy implementującej działanie (lub usługę).

Wtyczka Visual Studio Mono automatycznie generuje manifest, więc najlepiej nie modyfikować go ręcznie (jestem pewien, że istnieją 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);
  }
}
Sam jest
źródło
Właściwie widzę teraz, że to ustawienie WRITE_EXTERNAL_STORAGE jest uprawnieniem użytkownika, a jeśli zostanie ustawione tak, jak jest powyżej, pojawi się jako ustawienie aktywności (android: pozwolenie), a nie uprawnienie użytkownika w pliku manifestu. Aha, właśnie sobie przypomniałem, że ustawiłeś użytkownikowi uprawnienia użytkownika właściwości projektu w VS (jest to lista wszystkich uprawnień).
samis
1
W rzeczywistości są to tagi „użycie-pozwolenie”, a nie „pozwolenie użytkownika”, ale poza tym wszystko inne jest prawdą.
samis
Jedyną absolutnie konieczną rzeczą jest wywołanie if (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ć katalogu z pakietami. Niewykonanie tego wywołania powoduje, że mkdir lub mkdirs przestają działać.
pstorli