- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Android 中实现 OpenStreetMap MapView 时遇到问题。我正在使用 OsmDroid 库:问题是,当我在点击智能手机退出按钮(中间)后恢复应用程序时,或者当我点击最近的应用程序按钮时, map 没有显示,并且 View 停止在黑屏中。没有显示 ANR。 logcat 中没有异常消息。没有打印异常。只有黑屏。
问题是什么?我试过调试应用程序,但我没有发现异常。这是代码:
package it.presenteapp.ui;
import it.presenteapp.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.api.IGeoPoint;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.MinimapOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.PathOverlay;
import org.osmdroid.views.overlay.ScaleBarOverlay;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import it.presenteapp.network.NetworkResource;
import it.presenteapp.network.classForJSON.RouteResponse;
import it.presenteapp.utils.Config;
public class MapActivity extends Activity
{
private MapView mOsmv;
private Timer timerTask;
private boolean networkProviderEnabled;
private RouteResponse Route;
private GeoPoint currentLocation;
private Boolean doBackground =false;
private MyLocationNewOverlay partenza;
private GeoPoint arrivo;
private PathOverlay pathOverlay;
private Paint paint;
private MinimapOverlay miniMapOverlay;
private ScaleBarOverlay scaleBar;
private CompassOverlay compassOverlay;
private String nomeCognome;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
this.mOsmv = (MapView)findViewById(R.id.mapview);
Intent i=getIntent();
this.nomeCognome = i.getStringExtra("NomeCognome");
this.arrivo= new GeoPoint(i.getDoubleExtra("Latitudine",43.6156683),i.getDoubleExtra("Longitudine",13.5177356));
getActionBar().setTitle("Ricerca loculo: "+ nomeCognome);
}
@Override
protected void onResume()
{
super.onResume();
Log.e("MAPACTIVITY", "RESUME CALLED");
this.mOsmv.setTileSource(TileSourceFactory.CYCLEMAP);
this.mOsmv.setUseDataConnection(true);
this.mOsmv.setBuiltInZoomControls(true);
this.mOsmv.setMultiTouchControls(true);
this.mOsmv.setMinZoomLevel(4);
this.mOsmv.getController().setZoom(this.mOsmv.getMaxZoomLevel());
Log.e("1", "ok");
/* setto il marker di arrivo */
Drawable markerArrivo = this.getResources().getDrawable(R.drawable.arrivo);
ArrayList listItem = new ArrayList<OverlayItem>();
final OverlayItem itemArrivo = new OverlayItem(this.nomeCognome, "nato il "+ "\n"+ "morto il ", arrivo);
itemArrivo.setMarker(markerArrivo);
listItem.add(itemArrivo);
this.mOsmv.getOverlayManager().clear();
this.mOsmv.getOverlayManager().add(new ItemizedIconOverlay<OverlayItem>(listItem, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
Toast.makeText(getApplicationContext(),itemArrivo.getTitle()+"\n"+itemArrivo.getSnippet(),Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
//Toast.makeText(getApplicationContext(),"LUUUNGO",Toast.LENGTH_SHORT).show();
return false;
}
}, new DefaultResourceProxyImpl(getApplicationContext())));
Log.e("2", "ok");
/* setto il marker di partenza/attuale posizione dell'utente */
partenza = new MyLocationNewOverlay(getApplicationContext(),this.mOsmv);
partenza.enableFollowLocation();
partenza.enableMyLocation();
this.mOsmv.getOverlayManager().add(partenza);
Log.e("3", "ok");
/* aggiungo la scala della mappa */
scaleBar = new ScaleBarOverlay(this.getBaseContext(), this.mOsmv.getResourceProxy());
scaleBar.setCentred(true);
this.mOsmv.getOverlayManager().add(scaleBar);
Log.e("4", "ok");
/* aggiungo la bussola della mappa */
compassOverlay = new CompassOverlay(this, this.mOsmv);
compassOverlay.enableCompass();
this.mOsmv.getOverlayManager().add(compassOverlay);
Log.e("5", "ok");
/* aggiungo la mini mappa */
miniMapOverlay = new MinimapOverlay(this, this.mOsmv.getTileRequestCompleteHandler());
this.mOsmv.getOverlayManager().add(miniMapOverlay);
Log.e("6", "ok");
/* setto le proprietà del disegno della rotta */
this.paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAlpha(100);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(8);
Log.e("7", "ok");
/* inizializzo il routing via Graphopper */
this.startGraphopperTask();
Log.e("9", "ok");
}
@Override
protected void onPause() {
super.onPause();
Log.e("MAPACTIVITY","PAUSE CALLED");
this.timerTask.cancel();
this.mOsmv.setBuiltInZoomControls(false);
setVisible(false);
this.partenza.disableMyLocation();
this.partenza.disableFollowLocation();
this.mOsmv.getTileProvider().detach();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.map, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId())
{
case R.id.action_shortcut_map_credits:
Toast.makeText(this,"@ Univpm", Toast.LENGTH_SHORT).show();
return true;
case android.R.id.home:
onBackPressed();
return true;
default:
Log.e("premuto","altro");
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy()
{
Log.e("MAPACTIVITY","DESTROY CALLED");
super.onDestroy();
}
public void drawRoute(RouteResponse _Route)
{
if(this.pathOverlay != null)
this.mOsmv.getOverlayManager().remove(this.pathOverlay);
Log.e("new position","setted!");
PathOverlay newPathOverlay = new PathOverlay(Color.RED,MapActivity.this);
newPathOverlay.addPoints(_Route.getPaths()[0].getPoints().getCoordinatesGeoPoint());
newPathOverlay.setPaint(this.paint);
this.mOsmv.getOverlays().add(newPathOverlay);
this.pathOverlay = newPathOverlay;
TextView istruzioni= (TextView) findViewById(R.id.popup_ins);
istruzioni.setText(_Route.getPaths()[0].getInstructions()[0].getText());
istruzioni.setVisibility(TextView.VISIBLE);
doBackground=false;
}
public void centerPosition(View v)
{
this.mOsmv.getController().animateTo((IGeoPoint) partenza.getMyLocation());
while (true)
{
if (!this.mOsmv.isAnimating())
{
this.mOsmv.getController().setZoom(this.mOsmv.getMaxZoomLevel());
return;
}
}
}
private class GraphopperTask extends AsyncTask<Void, Void, Void>
{
RouteResponse puntiRotta;
@Override
protected void onPreExecute()
{
Log.e("task ricerc route", "partito!");
super.onPreExecute();
// before making http calls
}
@Override
protected Void doInBackground(Void... arg0)
{
NetworkResource net =new NetworkResource();
if(partenza.getMyLocation() != null)
{
try {
Log.e("FASE PRE-CHIAMATA ROUTE", "CORRETTA");
String StartPoint = new StringBuilder().append(partenza.getMyLocation().getLatitudeE6() / 1E6).append(",")
.append(partenza.getMyLocation().getLongitudeE6() / 1E6).toString();
String EndPoint = new StringBuilder().append(arrivo.getLatitudeE6() / 1E6).append(",")
.append(arrivo.getLongitudeE6() / 1E6).toString();
puntiRotta = net.getRoute(StartPoint, EndPoint);
Log.e("StartPoint", StartPoint);
Log.e("EndPoint", EndPoint);
Log.e("FASE PARSING ROUTE", "CORRETTA");
} catch (Exception e) {
Log.e("ERRORE", e.toString());
}
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
// After completing http call
// will close this activity and launch main activity
Route=puntiRotta;
drawRoute(Route);
}
}
private void startGraphopperTask()
{
final Handler handler = new Handler();
this.timerTask = new Timer();
TimerTask doAsynchronousTask = new TimerTask()
{
@Override
public void run()
{
handler.post(new Runnable()
{
public void run()
{
try
{
if(partenza.getMyLocation() != null)
{
GraphopperTask graphopperTask = new GraphopperTask();
// PerformBackgroundTask this class is the class that extends AsynchTask
graphopperTask.execute();
}
} catch (Exception e)
{
}
}
});
}
};
this.timerTask.schedule(doAsynchronousTask, Config.startRouteDelay, Config.updateRouteInterval);
Log.e("8", "ok");
}
}
最佳答案
问题是您在 onPause() 中调用 setVisible(false),而不是在 onResume() 中调用 setVisibile(true)。考虑到在这种情况下您不需要使用 setVisible(bool) 方法;根据 Android 文档(链接):
public void setVisible (boolean visible) Added in API level 3 Control whether this activity's main window is visible.This is intended only for the special case of an activity that is not going to show a UI itself, but can't just finish prior to onResume() because it needs to wait for a service binding or such. Setting this to false allows you to prevent your UI from being shown during that time. The default value for this is taken from the windowNoDisplay attribute of the activity's theme.
关于android - 带有 OsmDroid 的 MapView 中的黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24871666/
我正在尝试在 android.support.v4.app.Fragment 中使用 OSMdroid 的离线模式。我的图 block 是由 MOBAC 使用“OSMdroid Zip”格式在地球坐标
我一直在尝试从 osmdroid 上的地理服务器获取 WMS 瓷砖。但到目前为止还没有成功。我只是设法获得一个位于其他位置的小型版 block 地理服务器。是的,投影是正确的,因为我也在我的 Web
我有一个使用 osmdroid-android-4.1 的现有 android 应用程序。 现在我想使用新的 osmdroid-android-4.2。因此,我已将 JAR 文件(osm-androi
我尝试在我的一个应用程序中使用 OSMdroid,但我得到了这个: 运行在硬件设备Android 4.0.3 (CM9) 从 logcat 记录: 06-25 16:56:07.389: E/Andr
我的应用程序有问题,其中包括 osmdroid。每次我尝试在我的设备上运行该应用程序并触摸 map 时,该应用程序都会崩溃,并且出现此错误: 2018-10-02 14:11:45.191 1
////OSMdroid 以标记为中心//// 我添加了标记,我需要以所有标记都可见的方式映射最大的增加或减少 我的代码: public class mapcode extends Activity
我试图放置用户代理(参见 https://github.com/osmdroid/osmdroid/wiki/Important-notes-on-using-osmdroid-in-your-app
大家下午好,如何为我从文件中读取的每个点在 map 上创建或插入新的叠加层?为了阅读这些要点,我创建了一个实现FolderOverlay 的类。下面是我的项目的代码:. GeoOverlay.java
我正在使用 Android Studio 用 Java 编写一个应用程序。我已经使用 osmdroid 显示了 map ,添加了一些叠加层以在特殊位置显示标记,并向标记添加了标题和描述。 现在,我
我正在使用 Osmdroid 库来显示离线 map ,并使用折线在 map 上绘制线条。但结果线不是连续的。如果街道是弯曲的,那么这条线就断了。 我的代码: Polyline polyline
我正在使用 osmdroid,并且已将 MyLocationNewOverlay 添加到我的 map 中以显示我当前的位置。这看起来不错。我想要的是一个按钮,可以将 map 置于我当前位置的中心,类似
所以我想制作一个 CheckBoxPreference 来打开 osmdroid 中的夜间模式。但是代码没有任何作用。我在没有 PreferenceScreen 的情况下做了同样的事情,一个带有开关的
我需要有关 osmdroid 功能的代码的帮助,当我点击标记时,它不会返回标题和描述 谁能帮我...这是我的 代码 import java.util.ArrayList; import org.osm
我必须使用 osmdriod map api 实现导航。该 Activity 使用以下接收器从位置服务接收广播: public class ReceiveMessages extends Broadc
我正在尝试为 osmdroid 构建自定义缩放控件。我创建按钮并使用放大方法,如图所示 here但是当我点击按钮时没有任何反应。这是我的代码: private MapView map; @Overri
我在我的应用程序中使用 osmdroid 3.0.5 jar 来显示 map View 。我正在叠加一个由水平线和垂直线组成的叠加层。我注意到只有在某些位置,在高缩放级别时,一些线条会消失,然后在拖动
我有一个使用 OSMDroid 的项目。有一个绘制标记的循环,结束之后我必须将 map 居中放置在某个标记处。我的代码: //I have on open Cursor c Marker switch
我正在使用 OSMDroid,我有一组地理点,然后我创建了一条折线,如下所示: private void drawPolyline(ArrayList polyline) { Polyline
我正在使用 osmdroid 库来渲染 map 。我有两个间歇性变化的地理点,并希望 org.osmdroid.views.MapView 调整大小和转换以确保两个点始终可见。我可以轻松地将 map
1) 我可以使用不同的自定义标记吗? 我需要一个用于用户的位置,一个用于所有其他项目。 编辑:是的,你可以。 2) 我可以在标记中添加图像吗? 我需要为每个标记分配一个不同的图像(我将从数据库中获得)
我是一名优秀的程序员,十分优秀!