質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

1057閲覧

変数の受け渡しの仕方がわからない

fonfon11

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2023/01/13 05:52

編集2023/01/17 01:43

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/01/13 07:13

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
fonfon11

2023/01/13 08:25

丁寧に教えていただきありがとうございます。ご指摘の通り変更しました。見ていただけると幸いです。
jimbe

2023/01/13 09:25

>設定した時間に音が鳴るプログラム で SoundService を呼ぶときはどう書いていたのでしょうか。
fonfon11

2023/01/13 09:34

設定した時間に音が鳴るプログラムはURLのプログラムと同じものを使用させていただいています。 SoundServiceを呼ぶときはこのWakeUoActivity上で呼んでいます。 public class WakeUpActivity extends AppCompatActivity { Button stopBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_wake_up); Toolbar toolbar = findViewById(R.id.toolbarWakeUp); setSupportActionBar(toolbar); startService(new Intent(this, SoundService.class)); stopBtn = (Button) findViewById(R.id.stopBtn); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopService(new Intent(WakeUpActivity.this, SoundService.class)); } }); } }
jimbe

2023/01/13 12:22 編集

それなら AsyncHttpRequest で startService するはずですね。 result での音の選択はまず置いておいて、とりあえず SoundService を使って音を鳴らすコードにしては如何でしょうか。 それが出来れば後は http://hogedame.blogspot.com/2011/04/android.html とか https://stackoverflow.com/questions/5301891/android-start-service-with-parameter を参考に、つまりは Intent の Extras 経由で文字列を渡すように出来ると思います。
fonfon11

2023/01/13 12:37

SoundService を使って音を鳴らすコードとはどういうことでしょうか?今、SoundServiceを使って音を鳴らしていると認識していたんですが、今はSoundServiceを使えていないということですか?
jimbe

2023/01/13 13:53 編集

AsyncHttpRequest に SoundService を呼ぶ処理が見当たりませんが… AsyncHttpRequest 以外の所で呼んで鳴らしているということでしょうか。 AsyncHttpRequest が result を得て return してから SoundService が呼ばれる (startService される) 所までにどのようなコードを通っているのか、 fonfon11 さんのお手元では恐らく動いているものと思いますが、ご提示頂いているコードからは見えておりません。その辺りのコードが見えると、後は先のリンクのようなコードを埋め込むだけになると思います。
fonfon11

2023/01/13 14:12

今は初めに返信したときに貼ったWakeUpActivityでSoundServiceを呼んでいます。ジンベさんが言いたいのはAsyncHttpRequestでSoundServiceを呼んでみたらということですかということでしょうか?理解力が低くて申し訳ないです、、
jimbe

2023/01/13 14:49 編集

「緯度経度から位置情報を読み取って天気予報がわかるプログラムと設定した時間に音が鳴るプログラムをつくりました。この2つを結合しようと考えています。」 で、どこまで結合作業をされているかという所で、まだ(コードとして)くっついていないでしょうか。 WakeUpActivity は「設定した時間に音が鳴るプログラム」のタイマーで起動されるアクティビティで、 SoundService で鳴らしています。 AsyncHttpRequest は「緯度経度から位置情報を読み取って天気予報がわかるプログラム」の読み取る処理の部分で、 return result して後は受け側を何とかする方向と。 で、結合するとすると、 WakeUpActivity から AsyncHttpRequest を呼んで result を得て (WakeUpActivity か AsyncHttpRequest かどこかで) result をパラメータに SoundService を呼んでどれかを鳴らすという形になると思いますが、その形の(取り合えず result は渡せていない)コードは・・・まだ考え中というか渡し方が分かってからという感じですか。
guest

回答1

0

とりあえず、ボタンを押したらそれぞれの音がサービスで鳴る形にしてみます。
CLEAR/CLOUDS ボタンを押したらそれぞれの音が鳴るはずです。

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.content.Intent; 4import android.os.Bundle; 5import android.widget.Button; 6 7public class MainActivity extends AppCompatActivity { 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 Button clearButton = findViewById(R.id.clearButton); 14 clearButton.setOnClickListener(v -> { 15 Intent intent = new Intent(this, SoundService.class); 16 intent.putExtra(SoundService.EXTRA_RESULT, "Clear"); 17 startService(intent); 18 }); 19 20 Button cloudsButton = findViewById(R.id.cloudsButton); 21 cloudsButton.setOnClickListener(v -> { 22 Intent intent = new Intent(this, SoundService.class); 23 intent.putExtra(SoundService.EXTRA_RESULT, "Clouds"); 24 startService(intent); 25 }); 26 27 Button stopButton = findViewById(R.id.stopButton); 28 stopButton.setOnClickListener(v -> stopService(new Intent(this, SoundService.class))); 29 } 30}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <Button 10 android:id="@+id/clearButton" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="Clear" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toStartOf="@id/cloudsButton" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18 <Button 19 android:id="@+id/cloudsButton" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:text="Clouds" 23 app:layout_constraintBottom_toBottomOf="parent" 24 app:layout_constraintEnd_toEndOf="parent" 25 app:layout_constraintStart_toEndOf="@id/clearButton" 26 app:layout_constraintTop_toTopOf="parent" /> 27 <Button 28 android:id="@+id/stopButton" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="stop service" 32 app:layout_constraintBottom_toBottomOf="parent" 33 app:layout_constraintEnd_toEndOf="parent" 34 app:layout_constraintStart_toStartOf="parent" 35 app:layout_constraintTop_toBottomOf="@id/clearButton" /> 36 37</androidx.constraintlayout.widget.ConstraintLayout>

SoundService.java

java

1import android.app.Service; 2import android.content.Intent; 3import android.media.MediaPlayer; 4import android.os.IBinder; 5 6import java.util.*; 7 8public class SoundService extends Service { 9 static final String EXTRA_RESULT = "result"; 10 11 private static Map<String,Integer> soundMap = new HashMap<>(); 12 static { 13 soundMap.put("Clear", R.raw.wakeup); 14 soundMap.put("Clouds", R.raw.sound); 15 } 16 17 private MediaPlayer mediaPlayer; 18 19 @Override 20 public int onStartCommand(Intent intent, int flags, int startId) { 21 String result = intent.getStringExtra(EXTRA_RESULT); 22 23 mediaPlayer = MediaPlayer.create(this, soundMap.getOrDefault(result, R.raw.wakeup)); 24 mediaPlayer.setOnCompletionListener(mp -> play()); 25 play(); 26 return START_NOT_STICKY; 27 } 28 29 @Override 30 public void onDestroy() { 31 super.onDestroy(); 32 stop(); 33 } 34 35 @Override 36 public IBinder onBind(Intent intent) { 37 throw new UnsupportedOperationException("Not yet implemented"); 38 } 39 40 // 再生 41 private void play() { 42 mediaPlayer.start(); 43 } 44 45 // 停止 46 private void stop() { 47 if(mediaPlayer != null) { 48 mediaPlayer.stop(); 49 mediaPlayer.reset(); 50 mediaPlayer.release(); 51 mediaPlayer = null; 52 } 53 } 54}

AndroidManifest.xml の Application に以下を追加

xml

1 <service 2 android:name=".SoundService" 3 android:enabled="true" 4 android:exported="true" />

AsyncTask.doInBackGround からのデータを用いる方法として、AsyncTask を内部クラスにして onPostExecute で外部クラスのメソッドを呼ぶ際のパラメータとすることも可能です。
以下は CLOUDS ボタンを押したときは WeatherAsyncTask を起動し、 doInBackground の返り値を startSoundService のパラメータにしています。

java

1import android.content.Intent; 2import android.os.*; 3import android.util.Log; 4import android.widget.Button; 5 6import androidx.appcompat.app.AppCompatActivity; 7 8import java.net.*; 9 10public class MainActivity extends AppCompatActivity { 11 private static final String LOG_TAG = MainActivity.class.getSimpleName(); 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 Button clearButton = findViewById(R.id.clearButton); 19 clearButton.setOnClickListener(v -> { 20 startSoundService("Clear"); 21 }); 22 23 Button cloudsButton = findViewById(R.id.cloudsButton); 24 cloudsButton.setOnClickListener(v -> { 25 try { 26 new WeatherAsyncTask().execute(new URL("http://~")); 27 } catch(MalformedURLException e) { 28 e.printStackTrace(); 29 } 30 }); 31 32 Button stopButton = findViewById(R.id.stopButton); 33 stopButton.setOnClickListener(v -> stopService(new Intent(this, SoundService.class))); 34 } 35 36 private void startSoundService(String result) { 37 Intent intent = new Intent(this, SoundService.class); 38 intent.putExtra(SoundService.EXTRA_RESULT, result); 39 startService(intent); 40 } 41 42 class WeatherAsyncTask extends AsyncTask<URL, Void, String> { 43 private final String LOG_TAG = WeatherAsyncTask.class.getSimpleName(); 44 45 @Override 46 protected String doInBackground(URL... urls) { 47 Log.d(LOG_TAG, "doInBackground("+urls[0]+")"); 48 49 // URL にアクセスしてなんやかんや処理して resault が得た風 50 String result = "Clouds"; 51 52 return result; 53 } 54 55 @Override 56 protected void onPostExecute(String result) { 57 Log.d(LOG_TAG, "onPostExecute("+result+")"); 58 startSoundService(result); 59 } 60 } 61}

投稿2023/01/13 19:34

編集2023/01/16 10:21
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fonfon11

2023/01/15 23:15

土日忙しくて全然見れてなくて申し訳なかったです。こんなにやって頂いてありがとうございます。CLEAR/CLOUDSボタンを使わないとなると難しくなってしまうのでしょうか?
jimbe

2023/01/16 05:38 編集

>CLEAR/CLOUDSボタンを使わないとなると難しくなってしまうのでしょうか そういうわけではありません。 回答のコードで示したかったのは、それぞれのボタンに設定している処理と対応するサービスの処理です。 intent に putExtra で必要なデータを設定してサービスを起動し、サービス側は getXxxExtra (文字列なら getStringExtra) で取り出すことで、アクティビティからサービスにデータを渡せるということです。 プログラムは様々な仕様・処理の組み合わせです。 『サービスに晴れか曇りかを渡せばそれに応じた音が鳴る』という仕様にするのであれば、ネットから天気予報を得る処理が無くても回答のようなコードでとりあえずはサービスの作成・テストが出来ます。 後は、ボタンの変わりに天気予報を得る処理をアクティビティに作れば、天気予報によって違う音が鳴るようになりそうに思いませんか。
fonfon11

2023/01/16 07:12

ボタンの代わりに天気予報を得る処理をアクティビティに作るのはどうすればいいのでしょうか?結局AsyncHttpRequestのresultをもってこなければできないのではないんですか?質問ばかりで申し訳ないです。
fonfon11

2023/01/16 07:17

AsyncHttpRequestにputExtraでresultの値を入れようとしてもうまくできないのですが、AsyncHttpRequestは普通のクラスとは違うからなんでしょうか?
jimbe

2023/01/16 09:24 編集

本件は 2 つの要件が入っています。 1 つは AsyncTask で得た result を他で使えるようにすること、もう 1 つはその result によってサービスで違う音を鳴らすこと、です。 現在の回答の状態は後者ですので真っ先に「とりあえず」としたんですが…前者は今のところ 仰る通り「結局AsyncHttpRequestのresultをもってこなければできない」です。 AsyncTask は doInBackground を実行後、その return の値は EDT スレッドで実行される onPostExecute のパラメータとして渡されます。 AsyncTask を Activity の非 static な内部クラスとして定義することにより、 onPostExecute 内で Intent を生成してサービスを起動することが出来ると思います。
fonfon11

2023/01/17 01:40

後者についてはよくわかりました。ありがとうございます。回答して頂いた一番下のプログラムをWakeUpActivityに組み込んでみようとしたのですが、私のプログラムにCLEAR/CLOUDボタンがない(アラームアプリのため設定した時間に音が鳴る)のですが、そこはどのように改善したらよいのでしょうか?
jimbe

2023/01/17 05:10

ボタンを押した時の処理をすれば良いのですから、ボタンを押した時の処理をそのまま onCreate に書けば動くと思います。 先に書きました通り、プログラムは組み合わせです。天気予報の取得とアラーム音のサ ービス を組み合わせられるのと同じように、ボタン押下を検出する処理(OnClickListener)と天気予報の取得を組み合わせているだけですので、分解できます。
fonfon11

2023/01/17 07:42 編集

回答ありがとうございます。これを参考に下で貼ったような感じでもう一度組み込んでみたのですが、startSoundServiceとstartSoundService(String result)が赤文字になってしまいます。 public class WakeUpActivity extends AppCompatActivity { private static final String LOG_TAG =WakeUpActivity.class.getSimpleName(); Button stopBtn; double lat = 0.0; double lon = 0.0; private FusedLocationProviderClient fusedLocationClient; /** * 位置情報取得開始メソッド */ private void startUpdateLocation() { // 位置情報取得権限の確認 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 権限がない場合、許可ダイアログ表示 String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION}; ActivityCompat.requestPermissions(this, permissions, 2000); return; } // 位置情報の取得方法を設定 LocationRequest locationRequest = LocationRequest.create(); locationRequest.setInterval(10000); // 位置情報更新間隔の希望 locationRequest.setFastestInterval(5000); // 位置情報更新間隔の最速値 locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // この位置情報要求の優先度 fusedLocationClient.requestLocationUpdates(locationRequest, new MyLocationCallback(), null); } /** * 許可ダイアログの結果受取 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 2000 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 位置情報取得開始 startUpdateLocation(); } } public class MyLocationCallback extends LocationCallback { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } // 現在値を取得 Location location = locationResult.getLastLocation(); lat = location.getLatitude(); lon = location.getLongitude(); try { new com.example.alarmclock.activity.AsyncHttpRequest(this).execute(new URL("http://api.openweathermap.org/data/2.5/find?lat=" + lat + "&lon=" + lon + "&cnt=1&appid=771a5b50fdfa4f48b1db5a716c9c3ae8")); // new AsyncHttpRequest(this).execute(new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=270000")); } catch (MalformedURLException e) { e.printStackTrace(); } }; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 位置情報取得開始 startUpdateLocation(); //changeTextView(); setContentView(R.layout.confirmation_main); fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); setContentView(R.layout.activity_wake_up); Toolbar toolbar = findViewById(R.id.toolbarWakeUp); setSupportActionBar(toolbar); private void startSoundService(String result) { Intent intent = new Intent(this, SoundService.class); intent.putExtra(SoundService.EXTRA_RESULT, result); startService(intent); } startService(new Intent(this, SoundService.class)); stopBtn = (Button) findViewById(R.id.stopBtn); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopService(new Intent(WakeUpActivity.this, SoundService.class)); } }); } class AsyncHttpRequest extends AsyncTask<URL, Void, String> { private final String LOG_TAG=AsyncHttpRequest.class.getSimpleName(); @Override protected String doInBackground(URL...urls){ Log.d(LOG_TAG,"doInBackground("+urls[0]+")"); String result="Clouds"; return result; } @Override protected void onPostExecute(String result){ Log.d(LOG_TAG,"onPostExecute(\"+result+\")"); startSoundService(result); } } }
jimbe

2023/01/17 09:20 編集

startSoundService メソッドが onCreate メソッド内に入ってしまっています。 基本的に回答はサンプルであり、こちらには fonfon11 さんがお持ちのコードが全てあるわけではありませんので、それに合ったコードを作ることは出来ません。 詳細はご自身でお手元のコードに合わせて頂く必要があります。
fonfon11

2023/01/17 09:42

OnCreateに入れるとダメなんですね。ありがとうございます。jimbeさんにいただいたコードの49行目はAsyncHttpRequestの内容を入れるということで良いのでしょうか。
jimbe

2023/01/17 09:46 編集

WeatherAsyncTask クラスの doInBackground メソッドを ご質問本文の AsyncHttpRequest クラスの doInBackground メソッドに置き換えて頂くようなイメージですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問