2017-01-19 11 views
5

Stworzyłem aplikację, która może zaimportować plik do wewnętrznej pamięci. Aby otworzyć plik za pomocą aplikacji zewnętrznej (na przykład przeglądarki PF lub zdjęć), starałem się postępować zgodnie z tymi instrukcjami: the official guide, topic1, topic2, topic3 i topic4, ale bez powodzenia.Dlaczego używać FileProvider Nie mogę otworzyć pliku z INTERNAL STORAGE z aplikacjami zewnętrznymi?

Oto mój kod:

w moim oczywistym

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.myapp.chatcher" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_paths" /> 
</provider> 

moim wartość pakietu: package="com.myapp.catcher"

mój file_paths.xml

<paths 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="projection" path="." /> 
</paths> 

mój kod

String fileName = path.substring(path.lastIndexOf("/") + 1); 
String shelf = path.substring(path.lastIndexOf("PRIVATE") + 8, path.lastIndexOf("/")); 
File filePath = new File(mContext.getFilesDir(), "PRIVATE".concat("/").concat(shelf).concat("/")); 
File newFile = new File(filePath, fileName); 
Uri contentUri = FileProvider.getUriForFile(mContext, "com.myapp.chatcher", newFile); 

Intent myIntent = new Intent(); 
myIntent.setAction(Intent.ACTION_VIEW); 
myIntent.setData(contentUri); 
myIntent.setType(mimeType); 
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); 
mContext.startActivity(myIntent); 

I stworzył hierarchię tak:

PRIVATE -> shelf1 -> my files 

     -> shelf2 -> my files 

     -> shelfN -> my files 

na przykład: data/user/0/com.myapp.chatcher/files/PRIVATE/testshelf/Screenshot_2017-01-04-09-45-13.png

wynikiem drukowania newFile.getAbsolutePath() jest

/data/user/0/com.myapp.chatcher/files/PRIVATE/bogl/imagetest.jpg 

Kod ten otwiera w Chooser które mogę kliknąć na "Zdjęcia", a następnie otwiera "aplikację Zdjęcia" bez pokazywania mi pliku imagetest.jpg, ale w folderze, w którym znajdują się wszystkie zdjęcia. Jeśli spróbuję z plikiem pdf, nie otworzy się on w formacie pdf i pojawi się toast z komunikatem "no media".

Co jest nie tak z moim kodem?

+0

Komentarze nie są dla rozszerzonej dyskusji; ta rozmowa została [przeniesiona na czat] (http://chat.stackoverflow.com/rooms/133634/discussion-on-question-by-machoprogrammer-why-using-a-fileprovider-i-cant-open). –

Odpowiedz

4

Dzięki @greenapps, który jest ekspertem od Androida, stwierdziłem, że problem nie dotyczy dostawcy, ale intencji.

Zamiast tego:

Intent myIntent = new Intent(); 
myIntent.setAction(Intent.ACTION_VIEW); 
myIntent.setData(contentUri); 
myIntent.setType(mimeType); 
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); 
mContext.startActivity(myIntent); 

muszę to zrobić:

Intent myIntent = new Intent(Intent.ACTION_VIEW); 
myIntent.setDataAndType(contentUri, mimeType); 
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); 
mContext.startActivity(myIntent); 
+0

Mój problem nie został rozwiązany. – SimpleCoder

+0

Jaka jest różnica między 2 ??? Powinno to być dokładnie to samo. – Hrk

+0

https://developer.android.com/guide/components/intents-filters.html#Types _Jeśli chcesz ustawić zarówno identyfikator URI, jak i typ MIME, nie wywołuj funkcji setData() i setType(), ponieważ każda z nich unieważnia wartość z drugiej. Zawsze używaj setDataAndType(), aby ustawić zarówno identyfikator URI, jak i typ MIME._ Nie wiem dlaczego, ale możesz to przeczytać w oficjalnym dokumencie. – michoprogrammer

Powiązane problemy