这次采用高德地图提供的SDK来获取天气情况,并显示在桌面小组件上,首先要注册高德地图api KEY,高德开发平台官网的开发文档有详细介绍。这里讲一下如何获取SHA1值,借(fu)鉴(zhi)网上大神写的方法,直接Log打印出来即可
public String sHA1(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES); byte[] cert = info.signatures[0].toByteArray(); MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] publicKey = md.digest(cert); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < publicKey.length; i++) { String appendString = Integer.toHexString(0xFF & publicKey[i]) .toUpperCase(Locale.US); if (appendString.length() == 1) hexString.append("0"); hexString.append(appendString); hexString.append(":"); } String result = hexString.toString(); return result.substring(0, result.length()-1); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
利用android studio新建 Widget小组件很方便,new 一个appWidget,android studio 自动帮你创建widget的layout,config信息,继承自AppWidgetProvider的类,已经注册好相应的Manifest信息,此时小组件已经可以在桌面上显示了。试试看吧。
config信息 widget_info.xml 如下:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/weather_widget" 对应的widget的界面 android:initialKeyguardLayout="@layout/weather_widget" android:updatePeriodMillis="8640000" 刷新时间,android最低刷新时间为3分钟,一般可以设置大一点 android:previewImage="@drawable/example_appwidget_preview" 在手机小组件显示的图标,可以把自己喜欢的图片放进去 android:widgetCategory="home_screen|keyguard" 小组件的类别 android:minHeight="40dp" 最小高度 android:minWidth="110dp"> 最小高度 appwidget-provider>
WeatherWidger.class 继承自 AppWidgetProvider 主要方法有
public class WeatherWidget extends AppWidgetProvider{ @Override public void onEnabled(Context context) { //第一次添加小组件时调用的方法 super.onEnabled(context); Intent intent = new Intent(context,WeatherService.class); context.startService(intent); //开启获取天气的服务 } @Override public void onDisabled(Context context) { //最后一个小组件被移除时调用的方法 super.onDisabled(context); Intent intent = new Intent(context,WeatherService.class); context.stopService(intent); //关闭服务 } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { //更新小组件,这里我们用服务更新小组件,所以该方法不用添加代码 super.onUpdate(context, appWidgetManager, appWidgetIds); } }
新建一个处理天气并更新widget的Service类 WeatherService 继承自Service ,先去Manifest注册一下Service
public class WeatherService extends Service implements WeatherSearch.OnWeatherSearchListener{ private String cityName = "广州"; //想要查询的城市名称 @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); initWeather(); } //初始化天气 private void initWeather(){ WeatherSearchQuery weatherSearchQuery = new WeatherSearchQuery(cityName, //查询条件 WeatherSearchQuery.WEATHER_TYPE_LIVE); WeatherSearch weatherSearch = new WeatherSearch(WeatherService.this); weatherSearch.setQuery(weatherSearchQuery); //设置查询条件 weatherSearch.setOnWeatherSearchListener(this); //绑定监听 weatherSearch.searchWeatherAsyn(); //查询天气情况的异步接口 } //更新widget 这里主要用的是RemoteViews类和AppWidgetManager public void updateView(String result){ RemoteViews rv = new RemoteViews(getPackageName(),R.layout.weather_widget); //绑定widget的显示界面 rv.setTextViewText(R.id.widget_tv_content, result); //设置widget的文字 AppWidgetManager manager =AppWidgetManager.getInstance(WeatherService.this); //初始化AppWidgetManager ComponentName cn = new ComponentName(getApplication(),WeatherWidget.class); manager.updateAppWidget(cn,rv); //更新UI } //获取天气的情况 @Override public void onWeatherLiveSearched(LocalWeatherLiveResult localWeatherLiveResult, int rCode) { if (rCode == 1000){ //如果获取天气成功 LocalWeatherLive weatherLive = localWeatherLiveResult.getLiveResult(); //天气情况的一个封装类 String city = weatherLive.getCity(); //获取当前城市 String weather = weatherLive.getWeather(); //获取天气,晴天,多云等 String temp = weatherLive.getTemperature(); //获取温度,只是数字,自己后面加单位 String reportTime = weatherLive.getReportTime(); //获取天气更新的时间 StringBuffer sb = new StringBuffer(); sb.append(city).append("\n").append(weather).append("\n").append(temp).append("°C\n").append(reportTime).append("\n"); updateView(sb.toString()); //更新widget UI } } @Override public void onWeatherForecastSearched(LocalWeatherForecastResult localWeatherForecastResult, int i) { } }
查询天气用的是高德的搜索服务 AMapSearch SDK 下载地址 http://lbs.amap.com/api/android-sdk/download
最后,若以上有出错或者其他的,恳请指出,加以改正,希望一起学习一起进步。
best wish