安装apk时INSTALL_FAILED_OLDER_SDK

时间:2013-05-02 15:44:06

标签: android

我正在尝试在我的手机android 2.3.6中测试一个项目,我收到错误消息:INSTALL_FAILED_OLDER_SDK

该应用程序是关于在两点之间绘制路线;

有我的代码: 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>

谢谢,因为钥匙我确定这是一个很好的

4 个答案:

答案 0 :(得分:5)

或者:

  • 您的设备未运行Android 2.3.6或

  • 您的应用程序没有此清单,或

  • 您误解了某些内容,或

  • 您的设备或应用非常奇怪

只有当设备的API级别低于INSTALL_FAILED_OLDER_SDK时才会出现

android:minSdkVersion。在您的情况下,android:minSdkVersion7,即Android 2.1。因此,您不应该收到此错误。

答案 1 :(得分:2)

如果您使用的是Android工作室,则在清单文件旁边:

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

你也必须改变grandle.build文件

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 16
    }
}

答案 2 :(得分:0)

检查您是否已安装所需的最小值和/或与android sdk一起安装的目标版本SDK,在“工具”下查找匹配“Rev。”的构建工具;和匹配的API版本部分(即适用于SDK 19的Android 4.4.2 (API 19)

答案 3 :(得分:-2)

片段在API级别11之前不可用,因此android 2.3.6无法运行它