Android 定位+天气预报

代码如下:

package com.example.x.first;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

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

/**
 * Created by X on 2016/8/10.
 */
public class MyWeather extends Activity {

    private static final int UpdateCity = 0;
    private static final int updateWeather = 1;


    LocationManager locationManager;

    Location location;
    TextView tv_city;
    TextView tv_type;
    TextView tv_high;

    TextView tv_low;
    String address;


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

    }

    private void initView() {
        tv_city = (TextView) findViewById(R.id.tv_city);
        tv_type = (TextView) findViewById(R.id.tv_type);
        tv_high = (TextView) findViewById(R.id.tv_high);
        tv_low = (TextView) findViewById(R.id.tv_low);

        findViewById(R.id.ibReturn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    private void initDate() {
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        setListener();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case UpdateCity:
                    tv_city.setText(address);
                    new MyThread().start();
                    break;
                case updateWeather:
                    tv_high.setText(list.get(2).toString());
                    tv_low.setText(list.get(3).toString());
                    tv_type.setText(list.get(4).toString());
                    break;
            }
        }
    };

    public void setListener() {

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
//                updateLocation(location);
                try {
                    address = getCitynameByLocation(location);
                    handler.sendEmptyMessage(UpdateCity);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {
                if (ActivityCompat.checkSelfPermission(MyWeather.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MyWeather.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                try {
                    address = getCitynameByLocation(locationManager.getLastKnownLocation(provider));
                    handler.sendEmptyMessage(UpdateCity);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onProviderDisabled(String provider) {
//                updateLocation(null);
                try {
                    address = getCitynameByLocation(null);
                    handler.sendEmptyMessage(UpdateCity);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }





    private String getCitynameByLocation(Location location) throws IOException {
        String latLongString = "";
        String citiName = "";
//        TextView myLocationText;
//        myLocationText = (TextView)findViewById(R.id.myLocationText);
        if (location != null) {
            double lat = location.getLatitude();
            double lng = location.getLongitude();
//            latLongString = "纬度:" + lat + "\n经度:" + lng;
            List<Address> addList = null;
            Geocoder ge = new Geocoder(this);
            try {
                addList = ge.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(addList!=null && addList.size()>0){
                for(int i=0; i<addList.size(); i++){
                    Address ad = addList.get(i);
//                    latLongString += "\n";
                    latLongString = ad.getCountryName() + ";" + ad.getLocality();
                    citiName = ad.getLocality();
                }
            }
        } else {
            latLongString = "无法获取地理信息";
        }
        System.out.println("您当前的位置是:\n" +latLongString);
//        myLocationText.setText("您当前的位置是:\n" +latLongString);
        return citiName;
    }

    public void checkGPSIsOpen(){
        //判断GPS是否正常启动
        if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show();
            //返回开启GPS导航设置界面
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivityForResult(intent,0);
            return;
        }
    }




    //网络资源先获取输入流
    public InputStream getIS(String path) {
        InputStream is = null;
        try {
            //创建URL对象
            URL url = new URL(path);
            //获得httpurlconnection对象
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置请求方法
            conn.setRequestMethod("GET");
            //获取输入流
            is = conn.getInputStream();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;

    }







//    String path = "http://wthrcdn.etouch.cn/WeatherApi?city=%E5%8D%97%E4%BA%AC";
    String path = "http://wthrcdn.etouch.cn/WeatherApi?city=";
    String city;
    String cityPath;
    List list;


    public class MyThread extends Thread {

        @Override
        public void run() {

            try{
                int index = address.indexOf("市");
                if (index!=-1){
                    city = URLEncoder.encode(address.substring(0,index),"UTF-8");
                }else {
                    city = URLEncoder.encode(address,"UTF-8");
                }
                cityPath = path + city;
                System.out.println("cityPath---->"+cityPath);
                InputStream is = getIS(cityPath);

//                String str = convertStreamToString(is);
                list = xmlParse(is);
                handler.sendEmptyMessage(updateWeather);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }



    public List xmlParse(InputStream is) {
        List alist = new ArrayList();
        try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//            Document document = builder.parse(getAssets().open("weather.xml")) ;
            Document document = builder.parse(is);
            Element root = document.getDocumentElement();

            //获取城市
            NodeList list = root.getElementsByTagName("city");
            String city = list.item(0).getTextContent();
            NodeList list_wendu = root.getElementsByTagName("wendu");
            String wendu = list_wendu.item(0).getTextContent();
            System.out.println("city----------------->" + city);

            //获取当天信息
            NodeList list1 = root.getElementsByTagName("forecast");
            Element list_forecast = (Element) list1.item(0);

            Element element_weather = (Element) list_forecast.getElementsByTagName("weather").item(0);

            String weather_high = element_weather.getElementsByTagName("high").item(0).getTextContent();
            System.out.println("weather_high----------------->" + weather_high);
            String weather_low = element_weather.getElementsByTagName("low").item(0).getTextContent();
            System.out.println("weather_low----------------->" + weather_low);

            Element day = (Element) element_weather.getElementsByTagName("day").item(0);

            String type = day.getElementsByTagName("type").item(0).getTextContent();
            System.out.println("type----------------->" + type);

            alist.add(city);
            alist.add(wendu);
            alist.add(weather_high);
            alist.add(weather_low);
            alist.add(type);


        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return alist;
    }


}

权限:

<uses-permission android:name="android.permission.INTERNET" />
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值