2016-03-21 23 views
16

W widgecie wyświetlam obrazy z karty SDCard przy użyciu remoteView.setImageViewUri(). Strategia ta działa poprawnie z wyjątkiem prawoślazu:Wyświetlanie obrazów z karty SD w widgecie z MarshMallow

Błąd jest:

Unable to open content: file:///storage/emulated/0/Android/data/applicaitonPackage/files/file.png 
open failed: EACCESS (Permission denied) 

To jasne, że jest to problem pozwolenie, ale nie wiem jak dać uprawnienia do pojemnika widget i teoretycznie (patrz Uwaga 1) obrazy są już przechowywane w pamięci współdzielonej.

Uwaga 1: Katalog, w którym obrazy są przechowywane dzielone magazynowania pod Environment.getExternalStorageDirectory()

UWAGA 2: Aplikacja nie jest przystosowany do prawoślazu i wykorzystuje targetSdkVersion = 15

Uwaga 3: Don wystarczy odpowiedzieć, wyjaśniając o nowych uprawnieniach środowiska wykonawczego w MarshMallow. Już znam zmiany uprawnień i to nie jest problem, ponieważ aplikacja jest skierowana SDKVersion 15 i aplikacja nie ma żadnego problemu z dostępem do zewnętrznej pamięci masowej, problem dotyczy kontenera widżetów, który jest tym, który podejrzewam, że nie ma uprawnienia.

Odpowiedz

3

Oto kilka kroków, aby uzyskać uprawnienia do konfiguracji Android M i pamiętaj, że powinieneś zadeklarować to samo zezwolenie również w pliku manifestu.

Krok 1. stwierdzenie zmienna globalna:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 0; 

Krok 2. Za pomocą tego kodu w swojej głównej działalności

private void locationpermission() { 
// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(activity 
    , 
    Manifest.permission.ACCESS_COARSE_LOCATION) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, 
     Manifest.permission.ACCESS_COARSE_LOCATION)) { 

    // Show an expanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(activity, 
      new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
      MY_PERMISSIONS_REQUEST_LOCATION); 

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 
} 
} 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
           String permissions[], int[] grantResults)   { 
switch (requestCode) { 
case MY_PERMISSIONS_REQUEST_LOCATION: { 
    // If request is cancelled, the result arrays are empty. 
    if (grantResults.length > 0 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

     // permission was granted, yay! Do the 
     // contacts-related task you need to do. 

    } else { 

     // permission denied, boo! Disable the 
     // functionality that depends on this permission. 
    } 
    return; 
} 

// other 'case' lines to check for other 
// permissions this app might request 
} 
} 

Etap 3. wywołać tę metodę w swojej onCreate metodzie

locationpermission(); I każde pozwolenie, do którego możesz zadzwonić z tego miejsca, i każdy wynik, który możesz uzyskać w override metoda onRequestPermissionsResult this.

Dziękuje

nadzieja to pomoże (Y).

patrz stąd np

https://www.dropbox.com/s/w29sljy0zpwwm61/MyApplication.zip?dl=0

+0

można wyjaśnić to, czego nie dostają albo coś źle? –

+1

Już wiem, co mówisz. Nie dotyczy to aplikacji kierowanych na SDK w wersji 15, a także dlatego, że problemu nie ma w aplikacji. Problem polega na tym, że widget jest uruchamiany z zawartością widgetu, która jest osobną aplikacją. – lujop

+0

można wyjaśnić, jak uzyskać tę działalność w widgecie? – user2548816

0

Czy masz ten permisstion w pliku manifestu?

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
+1

mam WRITE_EXTERNAL_STORAGE że zgodnie docs udzielającego poczytać. Ale problem nie jest w aplikacji, problem jest w WidgetContainer który jest prowadzony w innym procesie przez OS. – lujop

2

@Docs mówi

Żądanie Uprawnienia W czasie wykonywania

Począwszy od Androida 6.0 (API poziom 23), użytkownicy udzielić uprawnień do aplikacji, gdy aplikacja jest uruchomiona, nie przy instalacji aplikacji . Takie podejście usprawnia proces instalacji aplikacji, ponieważ użytkownik nie musi udzielać uprawnień podczas instalowania lub aktualizowania aplikacji.Daje także użytkownikowi większą kontrolę nad funkcjonalnością aplikacji;

Dlatego to ma sens, choć deklarują zgodę w oczywisty ale wciąż się brak dostępu

Proponuję czytać jak uzyskać pozwolenie wykonania

http://developer.android.com/training/permissions/requesting.html

Oto przykład dostarczone przez Docs

if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CONTACTS)) { 

    // Show an expanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

    // MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 

}

Zmiana zezwolenia zgodnie ciebie wymogu

Nadzieję, że prowadzi do prawego kierunku

+1

Spójrz uwaga 2. Runtime premissions nie biorą w efekcie gdy targetSDK wynosi <23. – lujop

0

Gdybym ustawić targetSdkVersion do 15 zamiast 23 - będzie Android użytkownicy M zobaczyć aplikację i będą mogli ją pobrać (przyznanie wszystkie uprawnienia w czasie wykonywania)?

Tak, aplikacja będzie dostępna dla użytkowników M i każde uprawnienie jest przyznawane w czasie instalacji.

`targetSdkVersion=15` 

która jest mniejsza niż 23.User będą mogli pobrać aplikację i użyć go udziela wszystkie uprawnienia w czasie wykonywania. Jeśli chcesz sprawdzić uprawnienia, przejdź do ustawień i udziel uprawnień. Jeśli chcesz użyć modułu Android M w czasie wykonywania, musisz ustawić docelową wersję pakietu SDK na 23. . Jeśli ustawisz targetSdkVersion=15 w aplikacji Android M i wyższej, ulegnie awarii.

Jeśli chcesz wesprzeć użytkowników Androida m Ustawienie targetSdkVersion=23 i uchwyt zgody czas pracy.

Powiązane problemy