Pytanie Zezwolenie na zapis na kartę SD


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


76
2018-01-23 02:29


pochodzenie




Odpowiedzi:


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

File sdDir = Environment.getExternalStorageDirectory();

Jeśli jeszcze tego nie zrobiłeś, musisz podać swojej aplikacji poprawne pozwolenie na zapis na karcie SD, dodając poniższy wiersz do Manifestu:

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

203
2018-01-23 05:56



Dzięki ... zmienię kod zgodnie z Twoją 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
@ user244190 - zgaduję, że Twój telefon ma Androida 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ła zgodna z formatem forward. - Dave Webb
gotcha. dzięki... - bugzy
@DaveWebb: zobacz moje pytanie tutaj:stackoverflow.com/questions/9351904/... - Saher Ahwal
Nikt nie odpowiedział i nie wiem, dlaczego to nie działa. - Saher Ahwal


Sugerowana technika opisana powyżej w odpowiedzi Dave'a jest z pewnością dobrą praktyką projektową, i tak ostatecznie, w pliku AndroidManifest.xml należy ustawić wymagane uprawnienie, 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 nie ręcznie manipuluj nim (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);
  }
}

1
2017-08-22 18:46



Właściwie teraz 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 jako uprawnienie 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ń). - samsara
W rzeczywistości są to znaczniki "use-permission", a nie "user-permission", ale poza tym wszystko inne jest prawdziwe. - samsara
Jedną rzeczą absolutnie niezbędną 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ć pakietu. Niewykonanie tego połączenia powoduje, że mkdir lub mkdirs nie działają. - pstorli