質問編集履歴

2 編集

退会済みユーザー

退会済みユーザー

2017/06/10 18:06  投稿

Android端末で描画中に加速度センサとジャイロセンサの値を取得する
###前提・実現したいこと
Androidにおいて描画中の端末の加速度センサ、ジャイロセンサの値を取得するアプリを作っています。
しかし、デバックを行ってもActivity自体が起動せず困っています。
まだアプリ作成初心者なのもありますが、何かよい方法があれば教えていただきたいです。
よろしくお願いします。
開発環境はAndroidstudioになります。
###ソースコード
```Java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class SensorActivity extends Activity implements SensorEventListener{
   private boolean mRegisteredSensor;
   private SensorManager mSensorManager;
   DrawNoteView view;
   private static final int MENU_CLEAR = 0;
   private static final int MENU_SAVE = 1;
   private String ID;
   // 加速度センサーの値
   private float[] accelerometerValues = new float[3];
   private float[] magneticValues = new float[3];
 
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       view = new DrawNoteView(getApplication());
       setContentView(view);
       Intent intent = getIntent();
       ID = intent.getStringExtra("keyword");
       mRegisteredSensor = false;
       mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
       sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
       sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));
       for(List<Sensor> sensor : sensors){
           if(sensor.size()>0){
               mRegisteredSensor = mSensorManager.registerListener(this,
                       sensor.get(0),
                       SensorManager.SENSOR_DELAY_NORMAL);
           }
       }
   }
   @Override
   protected void onResume() {
       super.onResume();
       // 1.5
       {
           ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
           sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
           sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));
           for(List<Sensor> sensor : sensors){
               if(sensor.size()>0){
                   mRegisteredSensor = mSensorManager.registerListener(this,
                           sensor.get(0),
                           SensorManager.SENSOR_DELAY_NORMAL);
               }
           }
       }
   }
   @Override
   protected void onPause() {
       if (mRegisteredSensor) {
           mSensorManager.unregisterListener(this);
           mRegisteredSensor = false;
       }
       super.onPause();
   }
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) { // 1.5
   }
   ArrayList<Integer> accelx = new ArrayList<Integer>();
   ArrayList<Integer> accely = new ArrayList<Integer>();
   ArrayList<Integer> accelz = new ArrayList<Integer>();
   int x;
   int y;
   int z;
   @Override
   public void onSensorChanged(SensorEvent event) { // 1.5
       {
           if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
               accelerometerValues = event.values.clone();
           }
           else if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
               magneticValues = event.values.clone();
           }
           x = (int)accelerometerValues[0];
           y = (int)accelerometerValues[1];
           z = (int)accelerometerValues[2];
           accelx.add(x);
           accely.add(y);
           accelz.add(z);
           
       }
   }
   /** メニューの生成イベント */
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       super.onCreateOptionsMenu(menu);
       menu.add(0, MENU_CLEAR, 0, "Clear");
       menu.add(0, MENU_SAVE, 0, "Save");
       return true;
   }
   /** メニューがクリックされた時のイベント */
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       switch ( item.getItemId() ) {
           case MENU_CLEAR:
               view.clearDrawList();
               break;
           case MENU_SAVE:
               exec_post();
               break;
       }
       return true;
   }
}
///////////////////////////////////////////////////////////////////////////////////////  
//以下描画class//  
class DrawNoteView extends android.view.View {  
   ArrayList<Point> draw_list = new ArrayList<Point>();  
   private long startTime;  
   private long stopTime;  
   private long time ;  
   int mSecond = 0;  
   int mComma = 0;  
   int x;  
   int y;  
   int Count;  
   int size;  
   int range;  
   String xs;  
 
   ArrayList<Integer> drawtime_list = new ArrayList<Integer>();  
   ArrayList<Integer> drawX_list = new ArrayList<Integer>();  
   ArrayList<Integer> drawY_list = new ArrayList<Integer>();  
   ArrayList<Integer> drawsize_list = new ArrayList<Integer>();  
 
   public DrawNoteView(Context c) {  
       super(c);  
       setFocusable(true);  
   }  
 
   public void clearDrawList() {  
       draw_list.clear();  
       invalidate();  
   }  
 
   public void SaveData() {  
       time = stopTime - startTime;  
       mSecond=(int)time;  
       drawtime_list.add(mSecond);  
   }  
 
   /** 描画イベント */  
   protected void onDraw(Canvas canvas) {  
 
       canvas.drawColor(Color.WHITE);  
       Paint paint = new Paint();  
 
       paint.setARGB(255,100,100,255);  
       paint.setTextSize(64);  
       paint.setAntiAlias(true);  
       canvas.drawText("xs",50,300,paint);  
 
       paint.setColor(Color.BLUE);  
       paint.setStyle(Paint.Style.FILL);  
       paint.setStrokeWidth(4);  
// 記録した座標を順に繋げて描画する  
       Point q = new Point(-1,-1);  
       for (int i = 0; i < draw_list.size(); i++) {  
           Point p = draw_list.get(i);  
           if (p.x >= 0) {  
               if (q.x < 0) { q = p; }  
               canvas.drawLine(q.x, q.y, p.x, p.y, paint);  
           }  
           q = p;  
       }  
   }  
   /** タッチイベント */  
   public boolean onTouchEvent(MotionEvent event) {  
       x = (int)event.getX();  
       y = (int)event.getY();  
       drawX_list.add(x);  
       drawY_list.add(y);  
       draw_list.add(new Point(x, y));  
       float prer = event.getSize()*1000000000;  
   
       switch(event.getAction()){  
           case MotionEvent.ACTION_DOWN:  
               startTime = event.getEventTime();  
               break;  
 
           case MotionEvent.ACTION_MOVE:  
               break;  
 
           case MotionEvent.ACTION_UP:  
               draw_list.add(new Point(-1, -1));  
               stopTime = event.getEventTime();  
               SaveData();  
               size = drawX_list.size();  
               drawsize_list.add(size);  
 
               break;  
       }  
       invalidate();  
 
       return true;  
   }  
}  
```
###参考
Androidの加速度センサとジャイロセンサの併用
http://blog.livedoor.jp/tmako123-programming/archives/39477093.html
ここのプログラムを参考にしました。
  • Java

    17371 questions

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

  • Android

    7881 questions

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

  • Android Studio

    4713 questions

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

1  

退会済みユーザー

退会済みユーザー

2017/06/07 20:42  投稿

###前提・実現したいこと
Androidにおいて描画中の端末の加速度センサ、ジャイロセンサの値を取得するアプリを作っています。
しかし、デバックを行ってもActivity自体が起動せず困っています。
まだアプリ作成初心者なのもありますが、何かよい方法があれば教えていただきたいです。
よろしくお願いします。
開発環境はAndroidstudioになります。
###ソースコード
```Java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class SensorActivity extends Activity implements SensorEventListener{
private boolean mRegisteredSensor;
private SensorManager mSensorManager;
DrawNoteView view;
private static final int MENU_CLEAR = 0;
private static final int MENU_SAVE = 1;
private String ID;
// 加速度センサーの値
private float[] accelerometerValues = new float[3];
private float[] magneticValues = new float[3];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new DrawNoteView(getApplication());
setContentView(view);
Intent intent = getIntent();
ID = intent.getStringExtra("keyword");
mRegisteredSensor = false;
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));
for(List<Sensor> sensor : sensors){
if(sensor.size()>0){
mRegisteredSensor = mSensorManager.registerListener(this,
sensor.get(0),
SensorManager.SENSOR_DELAY_NORMAL);
}
}
}
@Override
protected void onResume() {
super.onResume();
// 1.5
{
ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));
for(List<Sensor> sensor : sensors){
if(sensor.size()>0){
mRegisteredSensor = mSensorManager.registerListener(this,
sensor.get(0),
SensorManager.SENSOR_DELAY_NORMAL);
}
}
}
}
@Override
protected void onPause() {
if (mRegisteredSensor) {
mSensorManager.unregisterListener(this);
mRegisteredSensor = false;
}
super.onPause();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { // 1.5
}
ArrayList<Integer> accelx = new ArrayList<Integer>();
ArrayList<Integer> accely = new ArrayList<Integer>();
ArrayList<Integer> accelz = new ArrayList<Integer>();
int x;
int y;
int z;
@Override
public void onSensorChanged(SensorEvent event) { // 1.5
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values.clone();
}
else if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
magneticValues = event.values.clone();
}
x = (int)accelerometerValues[0];
y = (int)accelerometerValues[1];
z = (int)accelerometerValues[2];
accelx.add(x);
accely.add(y);
accelz.add(z);
}
}
/** メニューの生成イベント */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_CLEAR, 0, "Clear");
menu.add(0, MENU_SAVE, 0, "Save");
return true;
}
/** メニューがクリックされた時のイベント */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch ( item.getItemId() ) {
case MENU_CLEAR:
view.clearDrawList();
break;
case MENU_SAVE:
exec_post();
break;
}
return true;
}
}
///////////////////////////////////////////////////////////////////////////////////////
//以下描画class//
class DrawNoteView extends android.view.View {
ArrayList<Point> draw_list = new ArrayList<Point>();
private long startTime;
private long stopTime;
private long time ;
int mSecond = 0;
int mComma = 0;
int x;
int y;
int Count;
int size;
int range;
String xs;
ArrayList<Integer> drawtime_list = new ArrayList<Integer>();
ArrayList<Integer> drawX_list = new ArrayList<Integer>();
ArrayList<Integer> drawY_list = new ArrayList<Integer>();
ArrayList<Integer> drawsize_list = new ArrayList<Integer>();
public DrawNoteView(Context c) {
super(c);
setFocusable(true);
}
public void clearDrawList() {
draw_list.clear();
invalidate();
}
public void SaveData() {
time = stopTime - startTime;
mSecond=(int)time;
drawtime_list.add(mSecond);
}
/** 描画イベント */
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setARGB(255,100,100,255);
paint.setTextSize(64);
paint.setAntiAlias(true);
canvas.drawText("xs",50,300,paint);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(4);
// 記録した座標を順に繋げて描画する
Point q = new Point(-1,-1);
for (int i = 0; i < draw_list.size(); i++) {
Point p = draw_list.get(i);
if (p.x >= 0) {
if (q.x < 0) { q = p; }
canvas.drawLine(q.x, q.y, p.x, p.y, paint);
}
q = p;
}
}
/** タッチイベント */
public boolean onTouchEvent(MotionEvent event) {
x = (int)event.getX();
y = (int)event.getY();
drawX_list.add(x);
drawY_list.add(y);
draw_list.add(new Point(x, y));
float prer = event.getSize()*1000000000;
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
startTime = event.getEventTime();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
draw_list.add(new Point(-1, -1));
stopTime = event.getEventTime();
SaveData();
size = drawX_list.size();
drawsize_list.add(size);
break;
}
invalidate();
return true;
}
}
```
###参考
Androidの加速度センサとジャイロセンサの併用
http://blog.livedoor.jp/tmako123-programming/archives/39477093.html
ここのプログラムを参考にしました。
  • Java

    17371 questions

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

  • Android

    7881 questions

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

  • Android Studio

    4713 questions

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

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