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

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

ただいまの
回答率

90.35%

  • Java

    14357questions

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

  • Android Studio

    3863questions

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

  • 配列

    545questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

加速度センサーのデータを配列へ 

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 959

pro

score 17

前提・実現したいこと

スマホの加速度センサーの値を配列に入れる。

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

event.values[0]にするとエラーは発生しないが、配列に入らないという感じです。

エラーメッセージ
event.values[0][i]に赤い波線で

Array type expected;found:'float'

該当のソースコード

float[][] accell = new float[3][3];

  public void onSensorChanged(SensorEvent event) {

for (int i = 0; i < 3; i++) {
            accell[0][i] = event.values[0][i];
            accell[1][i] = event.values[1][i];
            accell[2][i] = event.values[2][i];
}

試したこと

3行3列の配列を宣言し、センサーの値が変わったら繰り返し文で配列に格納しようとしました。

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

Androoidstudio

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

valuesはその時刻でのセンサーの値です。

センサーの履歴を取りたければ、たとえば
accell を float[1000][3]
とでもして、
取得するたびに0..999に順番に入れていけばいいです。

が、これだと1000サンプルまでしか取れないので
こういうときは普通List使います。
ArrayList<float[]>

値が来る度に、リストの末尾にその時刻のセンサの値を突っ込めば履歴になりますね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/25 18:20

    ご回答ありがとうございます。以下のような感じでコードを考えましたがうまくいきません。どこが間違っているか教えていただけると幸いです。
    ArrayList<Float> accell = new ArrayList <Float>();

    public void onSensorChanged(SensorEvent event) {

    for (int i = 0; i < accell.size(); i++) {
    accell.add(event.values[1]);
    data=accell.get(i);

    }}

    キャンセル

  • 2017/01/25 18:43

    では、
    そのfor文は何を意図して書いたのか説明してもらえますか?

    キャンセル

  • 2017/01/25 19:10

    検知したセンサーの値の数だけArrayListに入れて、それらのデータを取り出すことを目的としました。

    キャンセル

  • 2017/01/25 19:40

    取り出すのにfor文を使うのはわかりますが
    値の追加もなぜfor文で?

    キャンセル

  • 2017/01/25 20:28

    値の追加は外に出し以下のようにしました。
    accell.add(event.values[1]);
    for (int i = 0; i < accell.size(); i++) {
    accell.get(i);
    }
    その結果、テキストボックスに値を表示することができました。
    しかしやりたいことは、取れた値を1つ取り出す(たとえば3つ目に取れた値)ことなのですが。。。

    キャンセル

  • 2017/01/25 20:47

    1つ取り出せばいいなら
    加速度の履歴取る必要ないのでは?

    キャンセル

  • 2017/01/25 21:03

    最終的にやりたいことがあり、その前の段階として1つ取り出したいと思っています。
    加速度のデータは履歴として配列に入れたいです。

    キャンセル

+1

valuesは1次元の配列なので、values[0][i]のように2次元配列のように扱えません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/24 22:16

    回答ありがとうございます。
    では加速度センサーのデータを2次元データ(軸方向と時間)で処理するのは不可能なのでしょうか?

    キャンセル

  • 2017/01/24 23:55

    何をどうしたいのかいまひとつわからないのですが…

    キャンセル

  • 2017/01/25 00:04

    加速度センサーのデータを値を取得するともに配列に入れたいのですが、、、
    たとえば、0.1秒のとき[0],0.2秒のとき[1],..,0.n 秒のとき[n-1]へというイメージです。

    キャンセル

  • 2017/01/25 00:06

    そこまで細かく取得できるか自体怪しいのですが

    キャンセル

  • 2017/01/25 00:14

    実際はセンサーの値が変化したら取得できるので、等間隔ごとでは取れません。
    あくまでイメージとして伝えたかったので。わかりにくくて申し訳ないです。
    センサーの値が変わるごとに、新たな配列の箱に入れたいということです。

    キャンセル

+1

配列だとあふれてしまうので、多次元のArrayListが考えられますが
2次元のArrayListでは

ArrayList<ArrayList<型名>> list = new ArrayList<ArrayList <型名>>();

ただこれを増やしていくのは?です

x,y,z軸とtimestampとしてそのままArrayListに入れて
あとで4で割った余りを使って分けた方がいいように思います

また加速度センサーは端末のデバイスにもよりますが間隔はせいぜい20msec程度です

登録でsamplingPeriodUsという引数を設定できるのですが

registerListener (SensorEventListener listener, Sensor sensor, int samplingPeriodUs)

例えばNexus 5XのBosche BMI10の場合は
2.5ms, 5ms, 10ms, 20ms の値しか取れないようです

https://akira-watson.com/android/accelerometer.html

約20msecと想定して取り込んでも支障はないのでは
現実問題としてはそれ以外にフィルターをどう入れるかの方が重要だと思います
使用目的が分かりませんが

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/25 18:21

    ご回答ありがとうございます。以下のような感じでコードを考えましたがうまくいきません。どこが間違っているか教えていただけると幸いです。
    ArrayList<Float> accell = new ArrayList <Float>();

    public void onSensorChanged(SensorEvent event) {

    for (int i = 0; i < accell.size(); i++) {
    accell.add(event.values[1]);
    data=accell.get(i);

    }}
    とりあえず、y軸だけで考えてみました。

    キャンセル

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

  • Java

    14357questions

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

  • Android Studio

    3863questions

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

  • 配列

    545questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。