Я расширяю свою деятельность с помощью 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.
Заранее спасибо.