2017-08-07 12 views
5

Mam aplikację na Androida, która zasadniczo zapisuje listę plików gpx, które są zapisywane na telefonie użytkownika. Kiedy użytkownik kliknie na nazwę pliku w aplikacji, powinien wyświetlić użytkownikowi plik gpx z jakimikolwiek aplikacjami do rutowania dostępnymi na jego telefonie. Teraz testuję z otwarciem pliku w Osmand. Problem w tym, że Osmand się otwiera, ale natychmiast się zawiesza.Otwieranie pliku gpx w Osmand, z innej aplikacji

Kod, który próbuje otworzyć plik jest taka:

File gpxFile = new File(Path); 

Intent intent = new Intent(); 
intent.setAction(android.content.Intent.ACTION_VIEW); 

Uri gpxUri = FileProvider.getUriForFile(view.getContext(), AUTHORITY, gpxFile); 
intent.setDataAndType(gpxUri, "application/gpx+xml"); 

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

plików GPX wszystko wyglądać następująco:

<?xml version="1.0"?> 
<gpx creator="{CREATOR}" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> 
<wpt lat="{LAT_1}" lon="{LON_1}"> 
    <name>{WPT_NAME_1}</name> 
</wpt> 
... 
<wpt lat="{LAT_N}" lon="{LON_N}"> 
    <name>{WPT_NAME_N}</name> 
</wpt> 
<trk> 
    <name>{TRACK_NAME}</name> 
    <trkseg> 
    <trkpt lat="{LAT_1}" lon="{LON_1}"></trkpt> 
    ... 
    <trkpt lat="{LAT_N}" lon="{LON_N}"></trkpt> 
    </trkseg> 
</trk> 
</gpx> 

Na początku myślałem, że to coś złego formatu Pliki gpx, ale jeśli otworzę Osmand ręcznie i spróbuję zaimportować plik za pomocą "Configure map" -> "Gpx track", ścieżka pokazuje się dobrze na mapie, łącznie z punktami na drodze.

LE: Jest to błąd pojawia się, gdy OsmAnd próbuje uruchomić:

08-16 17:28:00.524 5681-5762/? E/net.osmand: RenderingRuleProperty Rendering parse in strokeWidth_2 
08-16 17:28:00.524 5681-5762/? E/net.osmand: RenderingRuleProperty Rendering parse in strokeWidth_2 
08-16 17:28:01.259 5681-5681/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: net.osmand, PID: 5681 
              java.lang.RuntimeException: Unable to resume activity {net.osmand/net.osmand.plus.activities.MapActivity}: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{3ddadf4 5681:net.osmand/u0a203} (pid=5681, uid=10203) that is not exported from uid 10275 
               at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3788) 
               at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991) 
               at android.app.ActivityThread.-wrap14(ActivityThread.java) 
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:154) 
               at android.app.ActivityThread.main(ActivityThread.java:6692) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 
               Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{3ddadf4 5681:net.osmand/u0a203} (pid=5681, uid=10203) that is not exported from uid 10275 
               at android.os.Parcel.readException(Parcel.java:1693) 
               at android.os.Parcel.readException(Parcel.java:1646) 
               at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4861) 
               at android.app.ActivityThread.acquireProvider(ActivityThread.java:5958) 
               at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2452) 
               at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1521) 
               at android.content.ContentResolver.query(ContentResolver.java:520) 
               at android.content.ContentResolver.query(ContentResolver.java:478) 
               at net.osmand.plus.helpers.GpxImportHelper.getNameFromContentUri(GpxImportHelper.java:108) 
               at net.osmand.plus.helpers.GpxImportHelper.handleContentImport(GpxImportHelper.java:69) 
               at net.osmand.plus.activities.MapActivity.onResume(MapActivity.java:617) 
               at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1277) 
               at android.app.Activity.performResume(Activity.java:7058) 
               at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3765) 
               at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828)  
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2991)  
               at android.app.ActivityThread.-wrap14(ActivityThread.java)  
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)  
               at android.os.Handler.dispatchMessage(Handler.java:102)  
               at android.os.Looper.loop(Looper.java:154)  
               at android.app.ActivityThread.main(ActivityThread.java:6692)  
               at java.lang.reflect.Method.invoke(Native Method)  
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  

Odpowiedz

1

Does OsmAnd brak uprawnień do odczytu tego pliku z FileProvider? Innymi słowy, czy to pomoże udzielić uprawnienia do odczytu w intencji przed wywołaniem startActivity:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

(nie wiem, czy OsmAnd potrzebuje również uprawnienia do zapisu Można spróbować dodać, że jak dobrze. FLAG_GRANT_WRITE_URI_PERMISSION) .

Sugerowałbym również uważne ponowne sprawdzenie konfiguracji pliku FileProvider w pliku filepaths.xml (w katalogu zasobów xml). Prawdopodobnie coś takiego:

<paths> 
    <files-path path="images/" name="myimages" /> 
</paths> 

np. Czy twój atrybut ścieżki pliku wskazuje na właściwy katalog? Czy żądane pliki gpx znajdują się w tym katalogu? (https://developer.android.com/training/secure-file-sharing/setup-sharing.html)

Inną sprawą, o której trzeba pamiętać, jest to, że ciąg znaków w elemencie dostawca musi być unikalny na urządzeniu. Tak więc, w tej części swojej AndroidManifest, upewnij się, że zostały zastąpione „com.example.myapp.fileprovider” coś wyjątkowego do aplikacji:

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

Jeśli to nie pomoże, mogę tylko sugerować oglądania logcat wyjście z urządzenia, aby zobaczyć, czy Osmand zapisuje stos śledzenia tego wypadku.

--- EDIT 17.08.2017 ---

Wystarczy umieścić kilka szczegółów na ciele tej odpowiedzi: jak A. M. udowodnione i opisane w komentarzach poniżej, rzeczywisty dylemat był jawnie przyznać uprawnienia niezbędne do wielu specyficznych pakietów na urządzeniu wywołując wielokrotnie context.grantUriPermission w pętli, coś takiego:

//grant permisions for all apps that can handle given intent 
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
for (ResolveInfo resolveInfo : resInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
} 

Takie podejście jest udokumentowane więcej tutaj: https://stackoverflow.com/a/18332000/3482621

potrzeba zadzwonić grantUriPermission (a nie tylko opierając się na intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION)) wydaje się zależeć od wersji platformy Android zainstalowanego na urządzeniu.Jest to opisane w raporcie o problemie tutaj: https://issuetracker.google.com/issues/37005552

+0

Dziękuję za odpowiedź, sprawdziłem wszystkie sugestie i wszystko wydaje się być w porządku, ale nadal nie działa. Pliki są zdecydowanie zapisane, ponieważ moja aplikacja również je otwiera i pokazuje trasę na mapie, a to działa dobrze. Tylko gdy kliknę przycisk, aby otworzyć je w osmandzie, a następnie osmand się zawiesza. –

+0

Interesujące. Czy Osmand loguje cokolwiek do LogCat, gdy się zawiesza? –

+0

Dodałem błąd, który otrzymuję, gdy Osmand próbuje otworzyć –

Powiązane problemy