這次採用高德地圖提供的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