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

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

ただいまの
回答率

88.05%

Fragment内で加速度センサーの値を出力したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,290
退会済みユーザー

退会済みユーザー

前提・実現したいこと

アプリ開発初心者です。よろしくお願いいたします。

Android Studioで、ある既存のアプリを改良しています。
アプリ内のFragmentが生きている間に、加速度センサーの値をファイルに出力したいです。

まず加速度センサーを出力するアプリを別で作成しました。
その後、コードを既存アプリのFragment内に書き写していきました。
通常通りアプリは動作するのですが、値・ログが出力されません

勉強不足のため全く見当違いのことをしているかもしれません。どうぞ宜しくお願いします。

※既存アプリの概要は、避難訓練のアプリです。
端末を持って歩き、ある地点に到達するとこのFragmentが起動し、画像や選択肢、テキストボックスが表示されます。

※加速度センサーの値を出力するアプリは、以下を参考にして作りました。
https://teratail.com/questions/49794

発生している問題・エラーメッセージ

アプリは通常通り動作するのですが、値が出力されません。
Log.dのでも出力されません。

該当のソースコード

public class EventNoteFragment extends Fragment implements SensorEventListener {

  private static final String TAG = EventNoteFragment.class.getSimpleName();
  private static final String URL_FORMAT = "http://training.bosai.club/images/event/%d.jpg";
  private EventDialogActivity parent;
  private HashMap<Integer, Integer> scoreMap;

  private Target panoTarget = null;

  public Sensor accSensor;
  public SensorManager manager;
  public int button_flag = 0;

  @Override
  public void onSensorChanged(SensorEvent sensorEvent) {

  manager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);
  accSensor = this.manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  if (button_flag == 0) {

  Log.d("SENSOR_DATA", "TYPE_ACCELEROMETER1 = " + String.valueOf(sensorEvent.values[0]));

  try {
  //出力先を作成する
  FileWriter fw = new FileWriter(Environment.getExternalStorageDirectory().getPath() + "/test.csv", true);
  PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

  //内容を指定する
  pw.print(String.valueOf(sensorEvent.values[0]));
  pw.print(",");
  pw.print(String.valueOf(sensorEvent.values[1]));
  pw.print(",");
  pw.print(String.valueOf(sensorEvent.values[2]));
  pw.println();

  //ファイルに書き出す
  pw.close();

  } catch (IOException ex) {
  //例外時処理
  ex.printStackTrace();
  }

  } else {

  }

  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  Log.d("hoge", "hogege");

  }

  public void onAttach(Activity activity) {
  parent = (EventDialogActivity) activity;

  super.onAttach(activity);
  }

  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

  final View view = inflater.inflate(R.layout.fragment_event_note, container, false);
  view.findViewById(R.id.button_event_note).setOnClickListener(new EventAlertButtonClickListener());

  // Set description
  ((TextView) view.findViewById(R.id.label_event_note_description)).setText(parent.missionArea.getDescription());

  // Set situation
  final String[] situations = getResources().getStringArray(R.array.event_type_situations);
  final String situationText = getString(R.string.label_event_situation,
  parent.missionArea.getTitle(),
  situations[parent.missionArea.getEventType().getId()]);

  final TextView labelEventNoteSituationTextView = (TextView) view.findViewById(R.id.label_event_note_situation);
  labelEventNoteSituationTextView.setText(situationText);

  final TextView labelEventNoteTextView = (TextView) view.findViewById(R.id.label_event_note);
  final EditText editEventNoteEditText = (EditText) view.findViewById(R.id.edit_event_note);

  switch (parent.missionArea.getAreaType()) {
  case START:
  labelEventNoteSituationTextView.setBackgroundColor(getResources().getColor(R.color.event_red));

  labelEventNoteTextView.setText(R.string.label_event_note_start);
  editEventNoteEditText.setHint(R.string.hint_note_start);
  break;
  case EVENT:
  labelEventNoteSituationTextView.setBackgroundColor(getResources().getColor(R.color.event_orange));

  labelEventNoteTextView.setText(R.string.label_event_note_event);
  editEventNoteEditText.setHint(R.string.hint_note_event);

  break;
  case INFORMATION:
  labelEventNoteSituationTextView.setBackgroundColor(getResources().getColor(R.color.event_blue));
  break;
  case GOAL:
  labelEventNoteSituationTextView.setBackgroundColor(getResources().getColor(R.color.event_green));
  break;
  }

  // Set image
  final ImageView eventNoteImageView = (ImageView) view.findViewById(R.id.image_event_note);
  final VrPanoramaView panoView = (VrPanoramaView) view.findViewById(R.id.pano_view);
  if (parent.missionArea.getAreaType() == AreaType.EVENT) {
  // EVENT
  final String imageUrl = String.format(URL_FORMAT, parent.missionArea.getId() % 100); // もとのURL取得

  panoTarget = new Target() {
  @Override
  public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
  VrPanoramaView.Options panoOptions = null;
  panoOptions = new VrPanoramaView.Options();
  panoOptions.inputType = VrPanoramaView.Options.TYPE_MONO;

  eventNoteImageView.setVisibility(View.INVISIBLE);
  panoView.setVisibility(View.VISIBLE);
  panoView.loadImageFromBitmap(bitmap, panoOptions);

  panoView.setFullscreenButtonEnabled(true);
  panoView.setInfoButtonEnabled(false);
  panoView.setTouchTrackingEnabled(true);
  panoView.setStereoModeButtonEnabled(false);
  }

  @Override
  public void onBitmapFailed(Drawable errorDrawable) {
  eventNoteImageView.setVisibility(View.VISIBLE);
  panoView.setVisibility(View.INVISIBLE);
  eventNoteImageView.setImageDrawable(errorDrawable);
  }

  @Override
  public void onPrepareLoad(Drawable placeHolderDrawable) {
  eventNoteImageView.setVisibility(View.VISIBLE);
  panoView.setVisibility(View.INVISIBLE);
  eventNoteImageView.setImageDrawable(placeHolderDrawable);
  }
  };

  Picasso.with(parent).load(imageUrl).into(panoTarget);
  } else {
  // START, GOAL, INFORMATION
  eventNoteImageView.setVisibility(View.VISIBLE);
  panoView.setVisibility(View.INVISIBLE);

  final String imageResName = "image_" + parent.missionArea.getEventType().toString().toLowerCase();
  final int imageResId = getResources().getIdentifier(imageResName, "drawable", parent.getPackageName());
  eventNoteImageView.setImageResource(imageResId);
  }

  int actionCount = parent.missionArea.getAction().length;

  // Generate random index
  Integer[] indexes = new Integer[actionCount];
  for (int i = 0; i < indexes.length; i++) {
  indexes[i] = i;
  }

  List<Integer> indexList = Arrays.asList(indexes);
  Collections.shuffle(indexList);

  // Set radiobutton
  scoreMap = new HashMap<>();
  for (int i = 0; i < actionCount; i++) {
  int buttonResId = getResources().getIdentifier("event_action_select" + i, "id", parent.getPackageName());
  final RadioButton radioButton = (RadioButton) view.findViewById(buttonResId);

  int index = indexList.get(i); // Random-ordered index

  radioButton.setText(parent.missionArea.getAction()[index]);

  // key: ResourceId of Radio Button, value: score
  scoreMap.put(radioButton.getId(), parent.missionArea.getScore()[index]);

  radioButton.setVisibility(View.VISIBLE);
  }

  final RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.radio_group_event_action);
  radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(RadioGroup group, int checkedId) {
  final EditText otherActionEditText = (EditText) view.findViewById(R.id.other_action_edit_text);

  if (checkedId == R.id.event_action_select_other) {
  otherActionEditText.setVisibility(View.VISIBLE);
  } else {
  otherActionEditText.setVisibility(View.GONE);
  }
  }

  });
  return view;
  }

  private class EventAlertButtonClickListener implements View.OnClickListener {

  @Override
  public void onClick(View v) {
  final EditText otherActionEditText = (EditText) getActivity().findViewById(R.id.other_action_edit_text);
  final boolean isOtherActionWrote = !otherActionEditText.getText().toString().equals("");

  final RadioGroup radioGroup = (RadioGroup) getActivity().findViewById(R.id.radio_group_event_action);
  final int selectedActionId = radioGroup.getCheckedRadioButtonId();
  final boolean isActionSelected = ((selectedActionId == R.id.event_action_select_other) && isOtherActionWrote)
  || ((selectedActionId != R.id.event_action_select_other) && (selectedActionId > 0));

  final EditText descriptionEditText = (EditText) getActivity().findViewById(R.id.edit_event_note);
  final boolean isNoteWrote = !descriptionEditText.getText().toString().equals("");

  if (isActionSelected && isNoteWrote) {
  // Action
  RadioButton selectedRadioButton = (RadioButton) getActivity().findViewById(selectedActionId);

  parent.actionPoint.setSelectedAction(selectedRadioButton.getText().toString());
  parent.actionPoint.setSelectedActionNote(otherActionEditText.getText().toString());

  if (scoreMap.containsKey(selectedRadioButton.getId())) {
  final Integer score = scoreMap.get(selectedRadioButton.getId());
  parent.actionPoint.setScore(score);
  } else {
  parent.actionPoint.setScore(3);
  }

  // Note
  parent.actionPoint.setDescription(descriptionEditText.getText().toString());

  parent.decideFragment(EventDialogActivity.Step.ADVICE);
  } else {
  Toast.makeText(parent, getString(R.string.info_no_input), Toast.LENGTH_SHORT).show();
  }
  }

補足情報(言語/FW/ツール等のバージョンなど)

端末:NEXUS7
minSdkVersion:19
targetSdkVersion:21

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keicha_hrs

    2017/11/12 16:16

    ソースコードは<code>というボタンを押したら出てくる```の間に挟んでください。最初の方の```の末尾にJavaと入れると、Javaコード用の表示になるので見やすくなります。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/12 16:25

    申し訳ありません。改善しました。

    キャンセル

回答 1

0

Fragmentがどうこうではないような感じがしますね。

  @Override
  public void onSensorChanged(SensorEvent sensorEvent) {

      manager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
      accSensor = this.manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

ここからしておかしくないでしょうか。getSystemServiceやgetDefaultSensorは事前処理として行うもので、それらを行ってからregisterListenerを設定することで、センサーの値が変化したときにonSensorChangedが呼び出される流れになるはずです。

ところが、上記のコードだとそのonSensorChangedの中で初期設定すべきことを行っているのですから、処理があべこべではありませんか?registerListenerしているところも見当たりませんし。参考にしたというページのコードと行っていることが全然違います。

これでは動かなくて当然のような気がしますが・・・。

(追伸)
```で囲った範囲はインデントがつけられます。全部同レベルというのは読むのにきついです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る