Android Studioでアプリ制作をしています。
天気によってアラーム音が変わる目覚ましアプリを作っています。
緯度経度から位置情報を読み取って天気予報がわかるプログラムと設定した時間に音が鳴るプログラムをつくりました。この2つを結合しようと考えています。resultの値の結果をSoundService.javaのif文の所で判別することで、天気によってアラーム音を変えれると思ったのですが、resultの値をうまくSoundService.javaに持ってくることができませんでした。Intentを使ったり、SoundService.javaのonStartCommandメソッドに天気APIを入れてやってみたりしたのですが、できませんでした。
わかりにくい文章ですが、どなたか答えていただくと助かります。また、ほかに良い方法があればご教授ください。
https://mura-hiro.com/android-dev-sample-alarm-clock/
アラームのアプリはこちらのサイトを参考にしました。
java
1package com.example.alarmclock.activity; 2 3import android.content.Intent; 4import android.os.AsyncTask; 5 6import org.json.JSONArray; 7import org.json.JSONException; 8import org.json.JSONObject; 9 10import java.io.BufferedReader; 11import java.io.IOException; 12import java.io.InputStream; 13import java.io.InputStreamReader; 14import java.net.HttpURLConnection; 15import java.net.URL; 16 17/** 18 * 非同期処理を行うクラス. 19 */ 20public final class AsyncHttpRequest extends AsyncTask<URL, Void, String> { 21 private int TODAY_FORCAST_INDEX = 0; 22 private ConfirmationActivity.MyLocationCallback mainActivity; 23 24 public AsyncHttpRequest(ConfirmationActivity.MyLocationCallback activity) { 25 // 呼び出し元のアクティビティ 26 this.mainActivity = activity; 27 } 28 29// public AsyncHttpRequest(SoundService.MyLocationCallback myLocationCallback) { 30// } 31 32 /** 33 * 非同期処理で天気情報を取得する. 34 * 35 * @param urls 接続先のURL 36 * @return 取得した天気情報 37 */ 38 @Override 39 protected String doInBackground(URL... urls) { 40 41 final URL url = urls[0]; 42 HttpURLConnection con = null; 43 44 try { 45 con = (HttpURLConnection) url.openConnection(); 46 con.setRequestMethod("GET"); 47 // リダイレクトを自動で許可しない設定 48 con.setInstanceFollowRedirects(false); 49 con.connect(); 50 51 final int statusCode = con.getResponseCode(); 52 if (statusCode != HttpURLConnection.HTTP_OK) { 53 System.err.println("正常に接続できていません。statusCode:" + statusCode); 54 return null; 55 } 56 57 // レスポンス(JSON文字列)を読み込む準備 58 final InputStream in = con.getInputStream(); 59 String encoding = con.getContentEncoding(); 60 if (null == encoding) { 61 encoding = "UTF-8"; 62 } 63 final InputStreamReader inReader = new InputStreamReader(in, encoding); 64 final BufferedReader bufReader = new BufferedReader(inReader); 65 StringBuilder response = new StringBuilder(); 66 String line = null; 67 // 1行ずつ読み込む 68 while ((line = bufReader.readLine()) != null) { 69 response.append(line); 70 } 71 bufReader.close(); 72 inReader.close(); 73 in.close(); 74 75 // 受け取ったJSON文字列をパース 76 //String content = {...} // JSON文字列 77 //JSONObject jsonContent = new JSONObject(content); 78 JSONObject jsonContent = new JSONObject(response.toString()); 79 JSONArray array = jsonContent.getJSONArray("list"); 80 JSONObject todayForcasts = array.getJSONObject(0); 81 JSONArray items = todayForcasts.getJSONArray("weather"); 82 83 // "main": "Clouds" の値をresultに 84 String result = items.getJSONObject(0).getString("main"); 85 //Log.d(TAG, result); 86 87 return result; 88 89 //JSONObject jsonObject = new JSONObject(response.toString()); 90 //JSONObject todayForcasts = jsonObject.getJSONArray("weather").getJSONObject(TODAY_FORCAST_INDEX); 91 92 //return "今日の天気は" + todayForcasts.getString("main"); 93 } catch (IOException e) { 94 e.printStackTrace(); 95 //return null; 96 return e.getMessage(); 97 } catch (JSONException e) { 98 e.printStackTrace(); 99 //return null; 100 return e.getMessage(); 101 } finally { 102 if (con != null) { 103 con.disconnect(); 104 } 105 } 106 } 107}
java
1package com.example.alarmclock.activity; 2 3import android.app.Service; 4import android.content.Intent; 5import android.location.Location; 6import android.media.MediaPlayer; 7import android.os.IBinder; 8 9import androidx.annotation.Nullable; 10 11import com.example.alarmclock.R; 12import com.google.android.gms.location.LocationCallback; 13import com.google.android.gms.location.LocationResult; 14 15import java.net.MalformedURLException; 16import java.net.URL; 17 18 19// 参考 https://github.com/hiroaki-dev/AlarmSample/blob/master/app/src/main/java/me/hiroaki/alarmsample/PlaySoundService.java 20 21public class SoundService extends Service implements MediaPlayer.OnCompletionListener{ 22 23 MediaPlayer mediaPlayer; 24 25 String result=""; 26 27 @Override 28 public void onCreate() { 29 super.onCreate(); 30 } 31 32 @Override 33 public int onStartCommand(Intent intent, int flags, int startId) { 34 35 // 参考 https://smartomaizu.com/ringtones/sozai/775.html 36 if (result=="Clear") { 37 mediaPlayer = MediaPlayer.create(this, R.raw.wakeup); 38 }else if (result=="Clouds"){ 39 mediaPlayer = MediaPlayer.create(this, R.raw.sound); 40 }else{ 41 mediaPlayer = MediaPlayer.create(this, R.raw.wakeup); 42 } 43 mediaPlayer.setOnCompletionListener(this); 44 play(); 45 return START_NOT_STICKY; 46 } 47 48 @Override 49 public void onDestroy() { 50 super.onDestroy(); 51 stop(); 52 } 53 54 @Nullable 55 @Override 56 public IBinder onBind(Intent intent) { 57 return null; 58 } 59 60 // 再生 61 private void play() { 62 mediaPlayer.start(); 63 } 64 65 // 停止 66 private void stop() { 67 if (mediaPlayer != null) { 68 mediaPlayer.stop(); 69 mediaPlayer.reset(); 70 mediaPlayer.release(); 71 mediaPlayer = null; 72 } 73 } 74 75 // 再生が終わる度に音量を上げてループ再生 76 @Override 77 public void onCompletion(MediaPlayer mediaPlayer) { 78 play(); 79 } 80}
java
1import android.content.Intent; 2import android.os.Bundle; 3 4import com.example.alarmclock.R; 5 6import androidx.appcompat.app.AppCompatActivity; 7import androidx.appcompat.widget.Toolbar; 8 9import android.view.View; 10import android.view.WindowManager; 11import android.widget.Button; 12 13import java.net.URL; 14 15// 参考 https://github.com/hiroaki-dev/AlarmSample/blob/master/app/src/main/java/me/hiroaki/alarmsample/PlaySoundActivity.java 16 17public class WakeUpActivity extends AppCompatActivity { 18 private static final String LOG_TAG =WakeUpActivity.class.getSimpleName(); 19 20 Button stopBtn; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 26 WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 27 WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | 28 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 29 30 setContentView(R.layout.activity_wake_up); 31 Toolbar toolbar = findViewById(R.id.toolbarWakeUp); 32 setSupportActionBar(toolbar); 33 34 35 startService(new Intent(this, SoundService.class)); 36 37 stopBtn = (Button) findViewById(R.id.stopBtn); 38 stopBtn.setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View view) { 41 stopService(new Intent(WakeUpActivity.this, SoundService.class)); 42 } 43 }); 44 45 46 } 47 48} 49 50