質問編集履歴

1 Serviceのソースコード、試したこと、補足を追記

mssgm

mssgm score 7

2019/02/13 22:22  投稿

ActivityのSpinnerの値をServiceへ送れません
### 前提・実現したいこと
 
初めて質問させていただきます。
Androidでアプリやブラウザ上に仮想ボタンのようなものを表示させ続けるアプリを作ろうと考えております。
 
現在、アプリのトップ画面を形成するActivity内にServiceを開始する(仮想ボタンを表示させる)ボタンとSpinnerを設定しており、Spinnerで選択された値によって仮想ボタンが表示される初期位置を決められるようにしたいと考えております。
そこで、Activity内のSpinnerで選択された値をService側へ送ればよいのではないかと考えており、intentを使ってActivityからServiceへ値を送りたいと考えております。しかし、Service側で値が参照できないのか、うまく値を送ることができません。
 
ActivityからServiceへ値を送るにはどうすればよいのでしょうか?よくわかっていない部分も多く、コードも見づらいとは思いますがどなたかご助力いただければ幸いです。
### 発生している問題・エラーメッセージ  
 
```
Compilation failed; see the compiler error output for details.
```
 
### 該当のソースコード
```Java
【MainActivity.java】
import android.annotation.TargetApi;
       import android.content.Intent;
       import android.net.Uri;
       import android.os.Build;
       import android.provider.Settings;
       import android.support.v7.app.AppCompatActivity;
       import android.os.Bundle;
       import android.util.Log;
       import android.view.View;
       import android.widget.AdapterView;
       import android.widget.ArrayAdapter;
       import android.widget.Button;
       import android.widget.Spinner;
public class MainActivity extends AppCompatActivity {
   public static int OVERLAY_PERMISSION_REQ_CODE = 1000;
   public String spinnerItems[] = {"①","②","③","④"};
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Button backHomeButton = findViewById(R.id.Button1);
       backHomeButton.setOnClickListener(new View.OnClickListener() {
           public void onClick(View v) {
               // ホーム画面に戻るインテントを起動
               Intent homeIntent = new Intent(Intent.ACTION_MAIN);
               homeIntent.addCategory(Intent.CATEGORY_HOME);
               homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               MainActivity.this.startActivity(homeIntent);
           }
       });
       Spinner spinner = findViewById(R.id.spinner);
       // ArrayAdapter
       ArrayAdapter<String> adapter
               = new ArrayAdapter<>(this,
               android.R.layout.simple_spinner_item, spinnerItems);
       adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
       // Spinnerにadapterをセット
       spinner.setAdapter(adapter);
       // リスナーを登録
       spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
           // アイテムが選択された時
           @Override
           public void onItemSelected(AdapterView<?> parent,
                                      View view, int position, long id) {
               Spinner spinner = (Spinner)parent;
               final String item = (String)spinner.getSelectedItem();
               // Serviceを開始するためのボタン
               final Button bt = findViewById(R.id.Button2);
               bt.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       if(item.equals("①")) {
                           Intent intent = new Intent(getApplication(), TestService.class);
                           // intentにデータを入れる
                           intent.putExtra("①", item);
                           // Serviceの開始
                           // API26以上
                           startForegroundService(intent);
                           bt.setEnabled(false);
                       }else if(item.equals("②")) {
                           Intent intent = new Intent(getApplication(), TestService.class);
                           intent.putExtra("②", item);
                           startForegroundService(intent);
                           bt.setEnabled(false);
                       }else if(item.equals("③")) {
                           Intent intent = new Intent(getApplication(), TestService.class);
                           intent.putExtra("③", item);
                           startForegroundService(intent);
                           bt.setEnabled(false);
                       }else{
                           Intent intent = new Intent(getApplication(), TestService.class);
                           intent.putExtra("④", item);
                           startForegroundService(intent);
                           bt.setEnabled(false);
                       }
                   }
               });
           }
           // アイテムが選択されなかった
           public void onNothingSelected(AdapterView<?> parent) {
           }
       });
       // API 23 以上であればPermission checkを行う
       //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       checkPermission();
       //}
   }
   @TargetApi(Build.VERSION_CODES.M)
   public void checkPermission() {
       if (!Settings.canDrawOverlays(this)) {
           Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                   Uri.parse("package:" + getPackageName()));
           startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
       }
   }
   @TargetApi(Build.VERSION_CODES.M)
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
           if (!Settings.canDrawOverlays(this)) {
               Log.d("debug","SYSTEM_ALERT_WINDOW permission not granted...");
               // SYSTEM_ALERT_WINDOW permission not granted...
               // nothing to do !
           }
       }
   }
}
```
```Java
【TestService.java】
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.TableLayout;
public class TestService extends Service {
   //画面に全面表示させるビュー
   private View view;
   private WindowManager windowManager;
   private int dpScale;
   private ImageButton button1, button2, button3, button4, button5, button6;
   private TableLayout tableLayout;
   @Override
   public void onCreate() {
       super.onCreate();
       // dipを取得
       dpScale = (int)getResources().getDisplayMetrics().density;
   }
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) { // startServiceでサービスが開始要求を受けた時のコールバック。
       // startForegroundService() -----
       Context context = getApplicationContext();
       String channelId = "default";
       String title = context.getString(R.string.app_name);
      ~(略)~
       Intent intent = getIntent();
       String item = intent.getStringExtra("①,②,③,④");
       params.gravity = Gravity.TOP | Gravity.END;
       if(item = intent.getStringExtra("①")) {
           // 左上(①)に配置
           params.x = 200 * dpScale; // 200dp
           params.y = 80 * dpScale; // 80dp
       }else if(item = intent.getStringExtra("②")) {
           // 右上(②)に配置
           params.x = 20 * dpScale; // 20dp
           params.y = 80 * dpScale; // 80dp
       }else if(item = intent.getStringExtra("③")) {
           // 左下(③)に配置
           params.x = 200 * dpScale; // 200dp
           params.y = 300 * dpScale; //
       }else {
               // 右下(④)に配置
               params.x = 20 * dpScale; // 20dp
               params.y = 300 * dpScale; // 300dp
       }
~(略)~
```
### 試したこと
ここに問題に対して試したことを記載してください。
```
Intent intent = getIntent();
   ~(略)~     
               // 右下(④)に配置
               params.x = 20 * dpScale; // 20dp
               params.y = 300 * dpScale; // 300dp
       }
```
の部分にエラーが出ております。if文(あるいはそれ以外の条件文)を使うこと自体がおかしいのか、ServiceではgetIntentを用いること自体ができないのか、様々なサイトを調べましたが、解決方法が見つかりませんでした。
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
言語:Java
開発環境:Android Studio3.1.3
  • Java

    17792 questions

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

  • Android

    8025 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4830 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る