Ustawienie apliakcji na liście aplikacji umożliwijących otworzenie pliku Json

0

Cześć!

Co chcę zrobić: Ustawić moją aplikacje na liście aplikacji dostępnych do wyboru do otworzenia pliku Json.

Opis: Plik Json znajduje się w menadżerze plików. Kiedy kliknę na niego pokazują się domyślne aplikacje do uruchomienia pliku jako Dokumenty/Muzyka/Filmy/Obrazy/Apliakcje/Inne. Rzecz którą muszę zrobić to pobrać dane z pliku json i przetworzyć je. Na chwilę obecną uzywam długiego przytrzymania na pliku, otwiera się menu narzędzi, wybieram Udostępnij i wskazuje na moją apliakcję. Działa to w pewny sposób, ale nie dokładnie jakbym tego oczekiwał, i dodatkowo nie będzie to komfortowe rozwiązanie dla przyszłych użytkowników.

Obecne ustawienie Manifestu wygląda następująco:

<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimetype="application/json" /> </intent-filter>

Kod do obierania akcji

Intent intent = getIntent();
if(intent.getAction().equals(Intent.ACTION_SEND)){
Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
...dalej przetwarzam plik

Nie wiem jak mógłbym coś takiego zrobić. Z góry dzięki za pomoc :)

0

Poprawny filtr w manifeście będzie wyglądał tak.

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/json"/>
  <data android:scheme="file"/>
  <data android:scheme="content"/>
  <data android:host="*"/>
  <data android:pathPattern=".*\\.json"/>
</intent-filter>
0

Testowałeś to może na urządzeniu fizycznym albo emulatorze? U mnie dalej bez zmian. Czy powinienem zmienić coś jeszcze oprócz manifestu i klasy odbierającej intencje?

0

Tak, testowałem i na urządzeniu i na emulatorze.

Możesz spróbować usunąć mimeType, bo niektóre menadżery plików potrafią namieszać. Ewentualnie zmienić na */*.

Możesz testować poniższymi poleceniami z konsoli i zobaczyć czy aplikacja na nie reaguje.

adb shell am start -a "android.intent.action.VIEW" -d "content://foo/bar.json"
adb shell am start -a "android.intent.action.VIEW" -d "file://foo/bar.json"

0

Nie wiem gdzie leży problem. Biorąc pod uwagę wszystkie twoje wskazówki, dalej nie mam żadnych efektów. Tak na marginesie testowałem na Huawei P10 lite (Android 8.0.0) i Sony Xperia Z (Android 5.1.1)

0

Pokaż cały manifest.

0
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.developer.jsonapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
        <activity android:name=".OpenActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="application/json" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <data android:host="*" />
                <data android:pathPattern=".*\\.json" />
            </intent-filter>
        </activity>
    </application>
</manifest>

0

Ok, już wiem, co jest grane. Jeżeli pliki są udostępniane przez content, to system potrafi zmienić ich nazwy widziane w innych aplikacjach. Czyli przykładowo plik foo.json może być widziany jako content://com.android.providers.documets/documets/1. W tym wypadku można liczyć tylko na to, że MIME będzie poprawny. Możesz zarejestrować coś takiego. Pierwszy filtr łapie wszystkie pliki *.json. Drugi łapie wszystkie pliki z MIME application/json.

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="*/*"/>
  <data android:scheme="file"/>
  <data android:scheme="content"/>
  <data android:host="*"/>
  <data android:pathPattern=".*\\.json"/>
</intent-filter>

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/json"/>
  <data android:scheme="file"/>
  <data android:scheme="content"/>
</intent-filter>
0

Nie jestem pewny czy błąd akurat leży w mimeType. Gdy sprawdzam jaki typ otrzymuje przez akcję ACTION.SEND w debugerze dostaję informację:

Intent { act=android.intent.action.SEND typ=*/* flg=0x1b080001 cmp=com.example.developer.jsonapp/.OpenActivity clip={*/* U:content://media/external/file/46835} (has extras) }

Czyli typ otrzymany to 'każdy typ' pomimo że manifest jest zadeklarowany na

<data android:mimeType="application/json" />

Myślę że sama obsługa powinna być napisana w inny sposób

0

No ok, ale w tym wypadku korzystasz z action.SEND a nie ze zwykłego otwierania plików. Dodaj w takim razie filtr podobny do tych wyżej tylko z action.SEND.

0

Zwracam honor, wszystko działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1