Google Map фатальное исключение на Android - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над проектом на Android. Одно из приложений - показать карту Google и указать некоторые местоположения. (Сначала он работает, показывая все булавки и карту, но через некоторое время вылетает, и я получил эту ошибку.

Построить Gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        applicationId "com.sptd.fleetbasic"
        minSdkVersion 23
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.7
        sourceCompatibility 1.7
    }
}

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.+'
    implementation 'com.android.support:design:27.+'
    implementation 'com.android.support:recyclerview-v7:27.+'
    implementation 'com.github.felHR85:UsbSerial:4.5.2'
    implementation 'com.google.android.gms:play-services-maps:15.0.1'
/*    implementation 'com.google.android.gms:play-services-maps:10.2.4'*/
}

Ошибка:

--------- beginning of crash
11-14 15:09:10.649  5239  5320 E AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ula-1
11-14 15:09:10.649  5239  5320 E AndroidRuntime: Process: com.sptd.fleetbasic, PID: 5239
11-14 15:09:10.649  5239  5320 E AndroidRuntime: java.lang.IllegalAccessError: Method 'java.lang.Object sq.a(int, java.lang.Object)' is inaccessible to class 'com.google.maps.api.android.lib6.impl.fg' (declaration of 'com.google.maps.api.android.lib6.impl.fg' appears in /data/data/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at com.google.maps.api.android.lib6.impl.fg.run(:com.google.android.gms.dynamite_mapsdynamite@14366044@14.3.66 (040300-213742215):28)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:818)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ula-1
11-14 15:09:10.649  5239  5320 E AndroidRuntime: Process: com.sptd.fleetbasic, PID: 5239
11-14 15:09:10.649  5239  5320 E AndroidRuntime: java.lang.IllegalAccessError: Method 'java.lang.Object sq.a(int, java.lang.Object)' is inaccessible to class 'com.google.maps.api.android.lib6.impl.fg' (declaration of 'com.google.maps.api.android.lib6.impl.fg' appears in /data/data/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at com.google.maps.api.android.lib6.impl.fg.run(:com.google.android.gms.dynamite_mapsdynamite@14366044@14.3.66 (040300-213742215):28)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:818)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ula-1
11-14 15:09:10.649  5239  5320 E AndroidRuntime: Process: com.sptd.fleetbasic, PID: 5239
11-14 15:09:10.649  5239  5320 E AndroidRuntime: java.lang.IllegalAccessError: Method 'java.lang.Object sq.a(int, java.lang.Object)' is inaccessible to class 'com.google.maps.api.android.lib6.impl.fg' (declaration of 'com.google.maps.api.android.lib6.impl.fg' appears in /data/data/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at com.google.maps.api.android.lib6.impl.fg.run(:com.google.android.gms.dynamite_mapsdynamite@14366044@14.3.66 (040300-213742215):28)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-14 15:09:10.649  5239  5320 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:818)
11-14 15:09:10.708  5239  5320 I Process : Sending signal. PID: 5239 SIG: 9
11-14 15:09:10.708  5239  5320 I Process : Sending signal. PID: 5239 SIG: 9
11-14 15:09:10.708  5239  5320 I Process : Sending signal. PID: 5239 SIG: 9
11-14 15:09:10.708  5239  5320 I Process : Sending signal. PID: 5239 SIG: 9

Мое устройство - андроид 6.0. Кто-нибудь знает, как это решить?

Отредактировано:

Вот код фрагмента, показывающий карту Google и пин-код местоположения. Я обнаружил, что ошибка обычно возникает после того, как я обновил метод (вызывается каждые несколько минут) ... (Первые несколько раз он удалял старые булавки и добавлял новые маркеры на карту, но впоследствии возвращался к ошибке) ..

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.ArrayList;
import java.util.List;


public class LocationFragment extends Fragment implements DataProvider.locationsAvailable {

    DataProvider dp;
    Info info;
    int sectionNo;
    MapView UnitsMapView;
    SearchView locationSearchView;
    TextView searchErrTV;
    LinearLayout searchError;

    List<Location> locations;
    Marker searchMarker;
    LatLng searchLatLng;
    private GoogleMap googleMap;

    final private String TAG = "Location";

    public LocationFragment() {
    }

    public static LocationFragment newInstance(int sectionNumber, DataProvider dp, Info info) {
        LocationFragment fragment = new LocationFragment();
        fragment.sectionNo = sectionNumber;
        fragment.dp = dp;
        fragment.info = info;
        fragment.locations = new ArrayList<>();
        return fragment;
    }

    //get refreshed location list from DataProvider and display on map with markers
    public void refreshed(List<Location> list) {
        locations.clear();
        locations = list;
        Log.d(TAG, "received from DP: " + locations.toString());
        if (locations != null) {
            if (googleMap != null) {
                googleMap.clear();
                LatLng Home = new LatLng(xxxx	, xxxx);
                googleMap.addMarker(new MarkerOptions().position(Home));
                for (int i = 0; i < locations.size(); i++) {
                    Location location_tmp = locations.get(i);
                    if (location_tmp.getlocationAvail()) {
                        LatLng unit_tmp = new LatLng(location_tmp.getLatitude(), location_tmp.getLongitude());
                        
                        googleMap.addMarker(new MarkerOptions().position(unit_tmp).title(location_tmp.getUnit().getName())
                                .icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("logo_pin", 40, 45))));
                    }
                }
            }
        }
    }

    public Bitmap resizeMapIcons(String iconName,int width, int height){
        Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(),getResources().getIdentifier(iconName, "drawable", ManageActivity.PACKAGE_NAME));
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(imageBitmap, width, height, false);
        return resizedBitmap;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_location, container, false);

        searchErrTV = (TextView) rootView.findViewById(R.id.searchErrTV);
        searchError =(LinearLayout) rootView.findViewById(R.id.SearchErr);

        //a search function for searching specific unit's location
        locationSearchView = (SearchView) rootView.findViewById(R.id.locationSearchView);
        locationSearchView.setSubmitButtonEnabled(true);
        //for changing text size of the search view as not responsive in xml
        LinearLayout linearLayout1 = (LinearLayout) locationSearchView.getChildAt(0);
        LinearLayout linearLayout2 = (LinearLayout) linearLayout1.getChildAt(2);
        LinearLayout linearLayout3 = (LinearLayout) linearLayout2.getChildAt(1);
        AutoCompleteTextView autoComplete = (AutoCompleteTextView) linearLayout3.getChildAt(0);
        autoComplete.setTextSize(19);

        final int searchCloseButtonId = locationSearchView.getContext().getResources()
                .getIdentifier("android:id/search_close_btn", null, null);
        ImageView closeButton = (ImageView) this.locationSearchView.findViewById(searchCloseButtonId);
        // Set on click listener for the close (cross symbol) button
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (searchMarker != null) {
                    searchMarker.remove();
                }
                searchError.setVisibility(View.GONE);
                locationSearchView.setQuery("", false);
                locationSearchView.clearFocus();
            }
        });

        locationSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                //to let visibility gone again in case user didn't press close button
                searchError.setVisibility(View.GONE);
                boolean unitFound = false;
                for(int i=0; i<locations.size(); i++) {

                    if ((locations.get(i).getUnit() != null) && (query.matches("^.*\\d+.*$"))){

                        if (locations.get(i).getUnit().getName().equalsIgnoreCase(query) ||
                                Integer.parseInt(locations.get(i).getUnit().getName().replaceAll("\\D+",""))
                                        == ( Integer.parseInt(query.replaceAll("\\D+",""))) ){
                            unitFound = true;
                            if (searchMarker != null) {
                                searchMarker.remove();
                            }

                            if (locations.get(i).getlocationAvail()) {
                                searchLatLng = new LatLng(locations.get(i).getLatitude(), locations.get(i).getLongitude());
/*                                searchMarker = googleMap.addMarker(new MarkerOptions().position(searchLatLng).title(locations.get(i).getUnit().getName())
                                        .icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("sptd_logo_pin", 180, 190))));*/
                                searchMarker = googleMap.addMarker(new MarkerOptions().position(searchLatLng).title(locations.get(i).getUnit().getName())
                                        .icon(BitmapDescriptorFactory.fromBitmap(resizeMapIcons("ogo_pin", 40, 45))));
                                searchMarker.showInfoWindow();
                                CameraPosition cameraPosition = new CameraPosition.Builder().target(searchLatLng).zoom(18).build();
                                googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                            } else {
                                searchErrTV.setText(R.string.locationErrNoCrumb);
                                searchError.setVisibility(View.VISIBLE);
                            }
                        }
                    }
                }
                if (unitFound == false){
                    searchErrTV.setText(R.string.locationErrNoUnit);
                    searchError.setVisibility(View.VISIBLE);
                }

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });

        dp.locationsListener = this;
        dp.refresh(DataProvider.LOCATIONS);
        dp.refresh(DataProvider.UNITS);

        UnitsMapView = (MapView) rootView.findViewById(R.id.UnitsMapView);
        UnitsMapView.onCreate(savedInstanceState);
        UnitsMapView.onResume();

        MapsInitializer.initialize(getActivity().getApplicationContext());

        UnitsMapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap mMap) {
                googleMap = mMap;

                LatLng Home = new LatLng(22.3900875	, 114.208085);
                googleMap.addMarker(new MarkerOptions().position(Home));

                CameraPosition cameraPosition = new CameraPosition.Builder().target(Home).zoom(12).build();
                googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
            }
        });
        return rootView;
    }


    @Override
    public void onResume() {
        super.onResume();
        UnitsMapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        UnitsMapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        UnitsMapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        UnitsMapView.onLowMemory();
    }
}

Другое дело, что устройство, которое я использую, вероятно, является рутованным, это тоже может быть проблемой?

1 Ответ

0 голосов
/ 14 ноября 2018

попробуйте поместить android: hardwareAccelerated = "true" в тег активности манифеста

Пожалуйста, добавьте это разрешение в манифест, если вы не включили

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

Также добавьте этот элемент в тег приложенияв манифесте:

android:name="com.google.android.gms.version"      android:value="@integer/google_play_services_ver sion" />

И включить это для opengl в manufest

<uses-feature
  android:glEsVersion="0x00020000"
  android:required="true"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...