2013-05-02 62 views
1

我想要在我的手機的Android 2.3.6測試一個項目,我得到的錯誤信息:INSTALL_FAILED_OLDER_SDKINSTALL_FAILED_OLDER_SDK當APK

應用程序是如何繪製兩個點之間的路線;

有我的代碼: xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
tools:context=".MainActivity" > 

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

java文件:

  package com.example.getroutexy2; 

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

     import org.w3c.dom.Document; 

     import com.google.android.gms.maps.CameraUpdateFactory; 
     import com.google.android.gms.maps.GoogleMap; 
     import com.google.android.gms.maps.SupportMapFragment; 
     import com.google.android.gms.maps.model.LatLng; 
     import com.google.android.gms.maps.model.MarkerOptions; 
     import com.google.android.gms.maps.model.PolylineOptions; 
     import com.google.android.maps.GeoPoint; 
     import com.google.android.maps.Overlay; 

     import android.app.ProgressDialog; 
     import android.graphics.Color; 
     import android.graphics.drawable.Drawable; 
     import android.location.Location; 
     import android.location.LocationManager; 
     import android.os.AsyncTask; 
     import android.os.Bundle; 
     import android.support.v4.app.FragmentActivity; 
     import android.view.Menu; 

     public class MainActivity extends FragmentActivity { 

      List<Overlay> mapOverlays; 
      GeoPoint point1, point2; 
      LocationManager locManager; 
      Drawable drawable; 
      Document document; 
      GMapV2GetRouteDirection v2GetRouteDirection; 
      LatLng fromPosition; 
      LatLng toPosition; 
      GoogleMap mGoogleMap; 
      MarkerOptions markerOptions; 
      Location location ; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       v2GetRouteDirection = new GMapV2GetRouteDirection(); 
       SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.map); 
        mGoogleMap = supportMapFragment.getMap(); 

        // Enabling MyLocation in Google Map 
        mGoogleMap.setMyLocationEnabled(true); 
        mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
        mGoogleMap.getUiSettings().setCompassEnabled(true); 
        mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true); 
        mGoogleMap.getUiSettings().setAllGesturesEnabled(true); 
        mGoogleMap.setTrafficEnabled(true); 
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 
        markerOptions = new MarkerOptions(); 
        fromPosition = new LatLng(11.663837, 78.147297); 
        toPosition = new LatLng(11.723512, 78.466287); 
        GetRouteTask getRoute = new GetRouteTask(); 
        getRoute.execute(); 
      } 

      private class GetRouteTask extends AsyncTask<String, Void, String> { 

       private ProgressDialog Dialog; 
       String response = ""; 
       @Override 
       protected void onPreExecute() { 
         Dialog = new ProgressDialog(MainActivity.this); 
         Dialog.setMessage("Loading route..."); 
         Dialog.show(); 
       } 

       @Override 
       protected String doInBackground(String... urls) { 
         //Get All Route values 
          document = v2GetRouteDirection.getDocument(fromPosition, toPosition, GMapV2GetRouteDirection.MODE_DRIVING); 
          response = "Success"; 
         return response; 

       } 

       @Override 
       protected void onPostExecute(String result) { 
         mGoogleMap.clear(); 
         if(response.equalsIgnoreCase("Success")){ 
         ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); 
         PolylineOptions rectLine = new PolylineOptions().width(10).color(
            Color.RED); 

         for (int i = 0; i < directionPoint.size(); i++) { 
          rectLine.add(directionPoint.get(i)); 
         } 
         // Adding route on the map 
         mGoogleMap.addPolyline(rectLine); 
         markerOptions.position(toPosition); 
         markerOptions.draggable(true); 
         mGoogleMap.addMarker(markerOptions); 

         } 

         Dialog.dismiss(); 
       } 
      } 
      @Override 
      protected void onStop() { 
       super.onStop(); 
       finish(); 
      } 

     } 

  package com.example.getroutexy2; 

     import java.io.InputStream; 
     import java.util.ArrayList; 

     import javax.xml.parsers.DocumentBuilder; 
     import javax.xml.parsers.DocumentBuilderFactory; 

     import org.apache.http.HttpResponse; 
     import org.apache.http.client.HttpClient; 
     import org.apache.http.client.methods.HttpPost; 
     import org.apache.http.impl.client.DefaultHttpClient; 
     import org.apache.http.protocol.BasicHttpContext; 
     import org.apache.http.protocol.HttpContext; 
     import org.w3c.dom.Document; 
     import org.w3c.dom.Node; 
     import org.w3c.dom.NodeList; 

     import android.util.Log; 

     import com.google.android.gms.maps.model.LatLng; 

     public class GMapV2GetRouteDirection { 

      public final static String MODE_DRIVING = "driving"; 
      public final static String MODE_WALKING = "walking"; 

      public GMapV2GetRouteDirection() { } 

      public Document getDocument(LatLng start, LatLng end, String mode) { 
       String url = "http://maps.googleapis.com/maps/api/directions/xml?" 
         + "origin=" + start.latitude + "," + start.longitude 
         + "&destination=" + end.latitude + "," + end.longitude 
         + "&sensor=false&units=metric&mode=driving"; 

       try { 
        HttpClient httpClient = new DefaultHttpClient(); 
        HttpContext localContext = new BasicHttpContext(); 
        HttpPost httpPost = new HttpPost(url); 
        HttpResponse response = httpClient.execute(httpPost, localContext); 
        InputStream in = response.getEntity().getContent(); 
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
        Document doc = builder.parse(in); 
        return doc; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      public String getDurationText (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("duration"); 
       Node node1 = nl1.item(0); 
       NodeList nl2 = node1.getChildNodes(); 
       Node node2 = nl2.item(getNodeIndex(nl2, "text")); 
       Log.i("DurationText", node2.getTextContent()); 
       return node2.getTextContent(); 
      } 

      public int getDurationValue (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("duration"); 
       Node node1 = nl1.item(0); 
       NodeList nl2 = node1.getChildNodes(); 
       Node node2 = nl2.item(getNodeIndex(nl2, "value")); 
       Log.i("DurationValue", node2.getTextContent()); 
       return Integer.parseInt(node2.getTextContent()); 
      } 

      public String getDistanceText (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("distance"); 
       Node node1 = nl1.item(0); 
       NodeList nl2 = node1.getChildNodes(); 
       Node node2 = nl2.item(getNodeIndex(nl2, "text")); 
       Log.i("DistanceText", node2.getTextContent()); 
       return node2.getTextContent(); 
      } 

      public int getDistanceValue (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("distance"); 
       Node node1 = nl1.item(0); 
       NodeList nl2 = node1.getChildNodes(); 
       Node node2 = nl2.item(getNodeIndex(nl2, "value")); 
       Log.i("DistanceValue", node2.getTextContent()); 
       return Integer.parseInt(node2.getTextContent()); 
      } 

      public String getStartAddress (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("start_address"); 
       Node node1 = nl1.item(0); 
       Log.i("StartAddress", node1.getTextContent()); 
       return node1.getTextContent(); 
      } 

      public String getEndAddress (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("end_address"); 
       Node node1 = nl1.item(0); 
       Log.i("StartAddress", node1.getTextContent()); 
       return node1.getTextContent(); 
      } 

      public String getCopyRights (Document doc) { 
       NodeList nl1 = doc.getElementsByTagName("copyrights"); 
       Node node1 = nl1.item(0); 
       Log.i("CopyRights", node1.getTextContent()); 
       return node1.getTextContent(); 
      } 

      public ArrayList<LatLng> getDirection (Document doc) { 
       NodeList nl1, nl2, nl3; 
       ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>(); 
       nl1 = doc.getElementsByTagName("step"); 
       if (nl1.getLength() > 0) { 
        for (int i = 0; i < nl1.getLength(); i++) { 
         Node node1 = nl1.item(i); 
         nl2 = node1.getChildNodes(); 

         Node locationNode = nl2.item(getNodeIndex(nl2, "start_location")); 
         nl3 = locationNode.getChildNodes(); 
         Node latNode = nl3.item(getNodeIndex(nl3, "lat")); 
         double lat = Double.parseDouble(latNode.getTextContent()); 
         Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); 
         double lng = Double.parseDouble(lngNode.getTextContent()); 
         listGeopoints.add(new LatLng(lat, lng)); 

         locationNode = nl2.item(getNodeIndex(nl2, "polyline")); 
         nl3 = locationNode.getChildNodes(); 
         latNode = nl3.item(getNodeIndex(nl3, "points")); 
         ArrayList<LatLng> arr = decodePoly(latNode.getTextContent()); 
         for(int j = 0 ; j < arr.size() ; j++) { 
          listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude)); 
         } 

         locationNode = nl2.item(getNodeIndex(nl2, "end_location")); 
         nl3 = locationNode.getChildNodes(); 
         latNode = nl3.item(getNodeIndex(nl3, "lat")); 
         lat = Double.parseDouble(latNode.getTextContent()); 
         lngNode = nl3.item(getNodeIndex(nl3, "lng")); 
         lng = Double.parseDouble(lngNode.getTextContent()); 
         listGeopoints.add(new LatLng(lat, lng)); 
        } 
       } 

       return listGeopoints; 
      } 

      private int getNodeIndex(NodeList nl, String nodename) { 
       for(int i = 0 ; i < nl.getLength() ; i++) { 
        if(nl.item(i).getNodeName().equals(nodename)) 
         return i; 
       } 
       return -1; 
      } 

      private ArrayList<LatLng> decodePoly(String encoded) { 
       ArrayList<LatLng> poly = new ArrayList<LatLng>(); 
       int index = 0, len = encoded.length(); 
       int lat = 0, lng = 0; 
       while (index < len) { 
        int b, shift = 0, result = 0; 
        do { 
         b = encoded.charAt(index++) - 63; 
         result |= (b & 0x1f) << shift; 
         shift += 5; 
        } while (b >= 0x20); 
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
        lat += dlat; 
        shift = 0; 
        result = 0; 
        do { 
         b = encoded.charAt(index++) - 63; 
         result |= (b & 0x1f) << shift; 
         shift += 5; 
        } while (b >= 0x20); 
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
        lng += dlng; 

        LatLng position = new LatLng((double) lat/1E5, (double) lng/1E5); 
        poly.add(position); 
       } 
       return poly; 
      } 

     } 

終於清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.getroutexy2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
    android:minSdkVersion="7" 
    android:targetSdkVersion="17" /> 

<permission 
    android:name="com.example.getroutexy2.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature" /> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 

<uses-permission android:name="com.example.getroutexy2.permission.MAPS_RECEIVE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.getroutexy2.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="AIzaSyCkdoZ..............." /> 

</application> 

感謝,對關鍵我敢肯定,這是一個很好的一個

回答

5

或者:

  • 您的設備未運行的是Android 2.3.6,或

  • 您的應用程序沒有此清單,或

  • 你曲解的東西,或者

  • 您的設備或應用程序是很奇怪的

INSTALL_FAILED_OLDER_SDK如果設備的API級別爲您android:minSdkVersion下面應該只發生。在你的情況下,android:minSdkVersion7,這是Android 2.1。因此,你不應該得到這個錯誤。

+0

上傳GoogleMapsAndroidv2.apk到設備上時啓動錯誤。google-play-services-lib與此有關嗎? – 2013-05-03 10:03:22

+0

@Med_mofid您應該編輯您的問題以包含此信息 – 2014-06-21 03:52:15

-2

的片段沒有作出avilailable直到API級別如果您使用的是Android工作室11因此安卓2.3.6不能運行

+1

該應用正在使用Android支持包的分段backport – CommonsWare 2013-05-02 16:50:17

+0

沒有它的工作,我以前使用它,它工作正常 – 2013-05-03 09:59:17

+0

哦好吧。我沒有意識到MapSupportFragment是支持API的一部分,以實現向後兼容性。你可以做的是嘗試和更改MinSDK,也許5,並看看是否安裝。你在使用任何新的外部罐子嗎?這可能會導致問題 – o0rebelious0o 2013-05-03 10:05:26

2

,清單文件旁邊:

<uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="19" /> 

您必須更改grandle.build文件也

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 9 
     targetSdkVersion 16 
    } 
} 
+0

他似乎沒有使用android studio。 – jperelli 2013-12-06 19:29:23

0

檢查是否具有所需的最小和/或與android sdk安裝在目標版本的SDK,在「工具」外觀與構建工具匹配「Rev.」;和匹配的API版本部分(即Android 4.4.2 (API 19) SDK 19)。

相關問題