Использование MapActivity для приложения MapView Crashes только на MarshMallow (6.0 и 6.0.1) - PullRequest
2 голосов
/ 21 июня 2019

Я расширяю свою деятельность с помощью MapActivity, чтобы динамически реализовывать MapView, который содержит фрагмент, отображающий mapView.

public abstract class BaseHomeActivity extends MapActivity

Я реализовал MapView во фрагменте, как показано ниже

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    rootView = (ViewGroup) inflater.inflate(R.layout.acs_widget_mymap, null);
    linearLayout = (LinearLayout) rootView.findViewById(R.id.mymap_widget_LinearLayout02);      
    if(AppStateObjects.getMapview() == null){       
        mapView = new CustomMapView(getActivity(), MAP_API_KEY);
    }else{
        mapView = AppStateObjects.getMapview();
    }

    this.inflater = inflater;
    mapView.setClickable(true);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.FILL_PARENT);     
    mapLayout.addView(linearLayout, layoutParams);      
    mapOverlays = linearLayout.getOverlays();
    iconworker = this.getResources().getDrawable(R.drawable.pointer_worker);
    iconequipment = getResources().getDrawable(R.drawable.pointer_equipment);
    initBroadCastReceiver();
    return rootView;
}

Ниже приведен класс CustomMapView

public class CustomMapView extends MapView
{
    // import com.google.android.maps.MapView;
    Context context;
    private Bitmap windowFrame;

    public CustomMapView(Context context, String apiKey)
    {
        super(context, apiKey);
        this.context = context;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        int action = ev.getAction();
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
                this.getParent().requestDisallowInterceptTouchEvent(true);
                break;

            case MotionEvent.ACTION_UP:
                this.getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
        super.onTouchEvent(ev);
        return true;
    }

    @Override
    protected void dispatchDraw(Canvas canvas)
    {
        super.dispatchDraw(canvas); 
        if (windowFrame == null)
        {
            createWindowFrame(); 
        }

        canvas.drawBitmap(windowFrame, 0, 0, null);
    }

    protected void createWindowFrame()
    {
        windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
        Canvas osCanvas = new Canvas(windowFrame); 
        RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight());
        RectF innerRectangle = new RectF(0, 0, getWidth(), getHeight());
        float cornerRadius = getWidth() / 50f; 

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
        paint.setColor(Color.rgb(18, 42, 71)); 
        osCanvas.drawRect(outerRectangle, paint);
        paint.setColor(Color.RED); 
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        osCanvas.drawRoundRect(innerRectangle, cornerRadius, cornerRadius, paint);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        super.onLayout(changed, l, t, r, b);
        windowFrame = null; 
    }
}

Когда я запускал приложение на устройствах Marshmallow (не на эмуляторах), приложение вылетает, как только оно пытается загрузить BaseHomeActivity (которая расширяет MapActivity).

Ниже авария:

    Fatal signal 11 (SIGSEGV), code 1, fault addr 0x5f53ee4c in tid 22257 (localz.mim)
06-21 08:30:32.781 3658-3658/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-21 08:30:32.781 3658-3658/? A/DEBUG: Build fingerprint: 'samsung/k3gxx/k3g:6.0.1/MMB29K/G900HXXS1CQD2:user/release-keys'
06-21 08:30:32.781 3658-3658/? A/DEBUG: Revision: '10'
06-21 08:30:32.781 3658-3658/? A/DEBUG: ABI: 'arm'
06-21 08:30:32.781 3658-3658/? A/DEBUG: pid: 22257, tid: 22257, name: localz.mim  >>> com.axis.localz.mim <<<
06-21 08:30:32.781 3658-3658/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x5f53ee4c
06-21 08:30:32.826 3658-3658/? A/DEBUG:     r0 1313900c  r1 131105d0  r2 131415e0  r3 0025e97c
06-21 08:30:32.826 3658-3658/? A/DEBUG:     r4 0000a3d0  r5 131105d0  r6 12e7fdf0  r7 131415e0
06-21 08:30:32.826 3658-3658/? A/DEBUG:     r8 00000001  r9 b4876500  sl 00000000  fp 12d86560
06-21 08:30:32.826 3658-3658/? A/DEBUG:     ip 13101790  sp be986d50  lr b34718c3  pc b44417f8  cpsr 20070030
06-21 08:30:32.846 3658-3658/? A/DEBUG: backtrace:
06-21 08:30:32.846 3658-3658/? A/DEBUG:     #00 pc 000ea7f8  /system/lib/libart.so (art_quick_imt_conflict_trampoline+7)
06-21 08:30:32.846 3658-3658/? A/DEBUG:     #01 pc 000cb8c1  /data/dalvik-cache/arm/system@framework@com.google.android.maps.jar@classes.dex (offset 0x84000)
06-21 08:30:34.341 3658-3658/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_03

Проблема:

обратите внимание на com.google.android.maps.jar в вышеуказанном родном сбое Поскольку я использовал «Google Maps Android v1 API», когда я портировал приложение из затмения в Android Studio (не было API Google, доступного в 25 и выше), мне пришлось использовать API 26 для нескольких функций, таких как JobIntentService и т. Д.

Были ошибки компиляции, связанные с MapActivity, которые я исправил, добавив maps.jar в папку libs и добавив ее как зависимость.

Если я удаляю MapActivity и расширяю свою BaseHomeActivity до AppCompatActivity и комментирую код моей карты, приложение отлично работает на устройствах с зефиром.

Любая идея, как я могу заставить это работать с "Google Maps Android v1 API" (есть некоторые ограничения для использования Google Maps Android V2 API) в Marshmallow, так как он работает на любой другой версии ОС, кроме Marshmallow.

Заранее спасибо.

...