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

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

ただいまの
回答率

87.78%

android studio ジャイロセンサとバイブレーションの条件指定のやり方について

解決済

回答 2

投稿 編集

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

score 5

イメージ説明いこと

android studioを使ってジャイロセンサの値を取得し、それぞれの軸が指定した範囲に入ったらバイブレーションが発生する

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

android studioで作成したプログラムで、androidスマートフォンを用いてジャイロセンサの値は取得できたのですが、範囲の中にバイブレーションが発生するプログラムを書き込むとvibratorにエラーが生じてしまい(スクリーンショット)、これの解決方法がわかりませんでした。

試したこと

まず、基盤となるジャイロセンサの値を取得し、条件を指定しました。その中にバイブレーションのプログラムをif文を使ってあてはめました

kotlin

import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import java.util.Locale
import android.os.Vibrator;
import android.content.Context;


class MainActivity : AppCompatActivity(), SensorEventListener {

    private var sensorManager: SensorManager? = null
    private var textView: TextView? = null
    private var textInfo: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Get an instance of the SensorManager
        sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager

        textInfo = findViewById(R.id.text_info)

        // Get an instance of the TextView
        textView = findViewById(R.id.text_view)

    }

    override fun onResume() {
        super.onResume()
        // Listenerの登録
        val gyro = sensorManager!!.getDefaultSensor(Sensor.TYPE_GYROSCOPE)

        if (gyro != null) {
            sensorManager!!.registerListener(this, gyro, SensorManager.SENSOR_DELAY_UI)
        } else {
            val ns = "No Support"
            textView!!.text = ns
        }
    }

    // 解除するコードも入れる!
    override fun onPause() {
        super.onPause()
        // Listenerを解除
        sensorManager!!.unregisterListener(this)
    }


    override fun onSensorChanged(event: SensorEvent) {
        Log.d("debug", "onSensorChanged")

        if (event.sensor.type == Sensor.TYPE_GYROSCOPE) {
            val sensorX = event.values[0]
            val sensorY = event.values[1]
            val sensorZ = event.values[2]

            val strTmp = String.format(Locale.US, "Gyroscope\n " + " X: %f\n Y: %f\n Z: %f", sensorX, sensorY, sensorZ)
            textView!!.text = strTmp

            showInfo(event)
        if(sensorX <= 1 && sensorY <=1 && sensorZ <=1) {
            ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000);
        }else{
            ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).cancel();
        }

        }

    }

    // センサーの各種情報を表示する
    private fun showInfo(event: SensorEvent) {
        // センサー名
        val info = StringBuffer("Name: ")
        info.append(event.sensor.name)
        info.append("\n")

        // ベンダー名
        info.append("Vendor: ")
        info.append(event.sensor.vendor)
        info.append("\n")

        // 型番
        info.append("Type: ")
        info.append(event.sensor.type)
        info.append("\n")

        // 最小遅れ
        var data = event.sensor.minDelay
        info.append("Mindelay: ")
        info.append(data.toString())
        info.append(" usec\n")

        // 最大遅れ
        data = event.sensor.maxDelay
        info.append("Maxdelay: ")
        info.append(data.toString())
        info.append(" usec\n")

        // レポートモード
        data = event.sensor.reportingMode
        var stinfo = "unknown"
        if (data == 0) {
            stinfo = "REPORTING_MODE_CONTINUOUS"
        } else if (data == 1) {
            stinfo = "REPORTING_MODE_ON_CHANGE"
        } else if (data == 2) {
            stinfo = "REPORTING_MODE_ONE_SHOT"
        }
        info.append("ReportingMode: ")
        info.append(stinfo)
        info.append("\n")

        // 最大レンジ
        info.append("MaxRange: ")
        var fData = event.sensor.maximumRange
        info.append(fData.toString())
        info.append("\n")

        // 分解能
        info.append("Resolution: ")
        fData = event.sensor.resolution
        info.append(fData.toString())
        info.append(" m/s^2\n")

        // 消費電流
        info.append("Power: ")
        fData = event.sensor.power
        info.append(fData.toString())
        info.append(" mA\n")

        textInfo!!.text = info
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {

    }
}

発生しているエラー

vibratorにエラーが生じてしまいました。
イメージ説明
回答にあった大文字var
イメージ説明

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

android studio ver 3.2.1
ジャイロセンサ
バイブレーション開始
バイブレーション停止
のサイト様を参考にしました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • jimbe

    2020/01/08 04:28

    使われているのは kotlin のようですので java のタグは外して頂けますか.
    また, コードのフォーマットに失敗されています.
    ```は行の先頭とし, ```の右の文字列はファイル名ではなく言語名(kotlin)としてください.
    コードの終わりにも ``` のみの行をいれてください.
    ご質問は編集できますので, 入力枠の下のプレビューを確認しながら編集して戴ければ, コードが枠に入るのを確かめられると思います.

    「android studioのジャイロセンサとバイブレーション」「android studioを使ってジャイロセンサの値を取得」「android studioでのジャイロセンサの値は」とおっしゃっていますが, 普通『android studio には』ジャイロセンサー等はありません.
    android『スマートフォン』のことであればそのように記述してください.

    キャンセル

  • hinoarashi

    2020/01/08 05:56 編集

    ご指摘ありがとうございます!
    間違った使い方をしていて申し訳ありませんでした。わかりやすいよう、細かくアドバイスしてくださり助かりました。ご指摘を元に修正させていただきました。

    キャンセル

回答 2

checkベストアンサー

+1

一度変数に入れては如何でしょうか.

val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
if(sensorX <= 1 && sensorY <=1 && sensorZ <=1) {
  vibrator.vibrate(1000)
}else{
  vibrator.cancel()
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/09 04:00

    ありがとうございます!解決しました!

    キャンセル

  • 2020/01/09 04:20

    ちなみに, 参考にされたコードは java ですので, キャストの書き方が異なっていたものと思います.

    キャンセル

  • 2020/01/09 04:24

    そういうことだったのですね!本当にありがとうございました!

    キャンセル

+1

Manifestにパーミッション追加してないのでは?
リンク先にもあるのでご確認下さい

<uses-permission android:name="android.permission.VIBRATE" />

あと思いつくのは
思い通りに条件が揃わないなら[rad]を[°]に変換したほうがスマホ触りながら感覚的に分かりやすいと思います
もしジャイロの値が取得できていないなら加速度センサにしてみては?
同リンク先の加速度センサ使用例
https://akira-watson.com/android/accelerometer.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/09 01:09

    丁寧な回答ありがとうございます。Manifestにはちゃんとパーミッションの文は追加されていました。
    エラーのスクリーンショットを追加で置かせていただきました。
    エラー箇所はvibratorの読み込みがうまくいってないところなのですが、どうしてここでエラーが出ているのか把握できていません。
    ラジアンと度数の指摘をいただきましたが、ジャイロセンサの値は取得できています。わかりにくく、質問自体に不備があり、申し訳ございませんでした。

    キャンセル

  • 2020/01/09 01:12

    "vibrator" は大文字 V の "Vibrator" では?

    キャンセル

  • 2020/01/09 01:19

    回答ありがとうございます。同様に試してみましたが、大文字のVibratorに変換しても同様のエラーメッセージが出てしまいました。

    キャンセル

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

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

関連した質問

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