🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Q&A

解決済

3回答

1525閲覧

Android端末が取得した加速度センサー値をSDカードに保存したい

Taiga_s

総合スコア8

Java

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

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

0グッド

2クリップ

投稿2019/12/11 00:35

前提・実現したいこと

端末が取得した加速度値(Z軸)をSDカードにcsvファイルで保存するアプリを作成したいです。
こちらのサイトを参考にしました。)

Android端末で、加速度を取得するのはできているのですが、
その値をSDカードに保存するのができないでいます。

AndroidアプリでSdカードに保存すること等について詳しい方、
ご教授いただけると幸いです。

(※)
マニフェストに、以下を追記し、
端末の「設定」→「アプリ」→「権限」→「ストレージON」済みです。

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

![イメージ説明

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

エラーは特に起きていないです。
シミュレータや実機へのビルドはできていますが、SDカードに保存できていない状況です。

該当のソースコード

java

1package com.example.myexterminalcsv02; 2 3import java.io.BufferedWriter; 4import java.io.FileNotFoundException; 5import java.io.FileOutputStream; 6import java.io.IOException; 7import java.io.OutputStreamWriter; 8import java.io.UnsupportedEncodingException; 9import java.util.Calendar; 10import java.util.List; 11 12import android.app.Activity; 13import android.hardware.Sensor; 14import android.hardware.SensorEvent; 15import android.hardware.SensorEventListener; 16import android.hardware.SensorManager; 17import android.os.Bundle; 18import android.view.View; 19import android.widget.Button; 20import android.widget.TextView; 21 22public class MainActivity extends Activity implements SensorEventListener { 23 24 int Start = 0; 25 26 //SensorManagerのインスタンス 27 private SensorManager sensorManager; 28 29 @Override 30 public void onCreate(Bundle savedInstanceState) { 31 32 super.onCreate(savedInstanceState); 33 34 //SensorManagerのインスタンスを取得 35 sensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE); 36 37 setContentView(R.layout.activity_main); 38 } 39 40 @Override 41 protected void onResume() 42 { 43 super.onResume(); 44 List<Sensor>sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); 45 //リスナーの登録 46 for(Sensor s : sensors) 47 { 48 sensorManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMAL ); 49 } 50 } 51 @Override 52 public void onAccuracyChanged(Sensor sensor, int accuracy) { 53 54 } 55 @Override 56 public void onSensorChanged(SensorEvent e) { 57 58 Calendar time = Calendar.getInstance(); 59 60 int hour = time.get(time.HOUR_OF_DAY); 61 int minute = time.get(time.MINUTE); 62 int second = time.get(time.SECOND); 63 int ms = time.get(time.MILLISECOND); 64 65 Button buttonSave = findViewById(R.id.buttonSave); 66 Button buttonStop = findViewById(R.id.buttonStop); 67 68 //保存ボタンを押したら、保存開始 69 buttonSave.setOnClickListener(new View.OnClickListener() { 70 @Override 71 public void onClick(View view) { 72 Start = 1; 73 } 74 }); 75 76 //停止ボタンを押したら、保存終了 77 buttonStop.setOnClickListener(new View.OnClickListener() { 78 @Override 79 public void onClick(View view) { 80 Start = 0; 81 } 82 }); 83 84 String nowtime = (hour) + ":" + (minute) + ":" + (second) + ":" + (ms); 85 86 if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 87 88 TextView z = findViewById(R.id.textViewZ); 89 z.setText("z: " + (e.values[2])); 90 91 if (Start==1) { 92 String FILE = "/sdcard/test.csv"; 93 try { 94 95 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 96 new FileOutputStream(FILE, true), "UTF-8")); 97 String write_int = nowtime + "," + (e.values[2]) + "\n"; 98 bw.write(write_int); 99 bw.close(); 100 } catch (UnsupportedEncodingException k) { 101 k.printStackTrace(); 102 } catch (FileNotFoundException k) { 103 k.printStackTrace(); 104 } catch (IOException k) { 105 k.printStackTrace(); 106 } 107 } 108 } 109 110 } 111 112 113 @Override 114 protected void onStop() 115 { 116 super.onStop(); 117 sensorManager.unregisterListener(this); 118 } 119}

activity_main.mxlに、
保存ボタン(@+id/buttonSave)、停止ボタン(@+id/buttonStop)を設けて
保存ボタンを押したら取得開始、
停止ボタンを押したら取得終了。
というコードを打っているつもりではいます。
(↓画面)
イメージ説明

試したこと

①書籍を参考に、editTextに書かれた文章を内部ストレージに保存するプログラムは作れたので、取得した加速度値をeditTextに自動入力できれば解決できるとは思ったのですが、そのことに詳細なサイトは見つからなかったので不可能かもしれないと考えて断念してます。
(もし、editTextに加速度値を自動入力できるのであれば、それでも解決できるのかなとは考えてます。)

こちらの質問で記載されていた、

<use-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

をマニフェストに追記したらビルドができなくなったため、書いてないです。

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

ーー開発環境ーー
MacOS.Catalina.10.15
ArduinoIDE1.8.10
AndroidStudio3.5.2

ーーAndroid端末ーー
Elephone P8 Mini(Android OS v7.0)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

内部ストレージにcsvファイルを保存することができました。

SDカード保存はまだできてないのですが、
端末で取得した加速度値を書き込んだcsvファイルを出力したかっただけなので
内部ストレージに保存するというアプローチで解決しました。

(内部ストレージに加速度値を保存したcsvファイルを書き込む→デバイスファイルエクスプローラーでdata/data/com.example.パッケージ名/files/test001.csvがあることを確認)

ご回答して下さった、
Hiroshi_Kito様、aja様
誠にありがとうございました。

該当のソースコード

java

1package com.example.mycsvaccelerometer; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.hardware.Sensor; 6import android.hardware.SensorEvent; 7import android.hardware.SensorEventListener; 8import android.hardware.SensorManager; 9import android.os.Bundle; 10import android.view.View; 11import android.widget.Button; 12import android.widget.TextView; 13import android.widget.Toast; 14 15import java.io.IOException; 16import java.io.OutputStream; 17import java.io.OutputStreamWriter; 18import java.io.PrintWriter; 19import java.util.ArrayList; 20import java.util.Calendar; 21import java.util.Timer; 22import java.util.TimerTask; 23 24public class MainActivity extends AppCompatActivity { 25 26 SensorManager sensorManager; //センサーマネージャー 27 Sensor accelSensor; //加速度センサー 28 MySensorEventListener mySensorEventListener; //センサーのイベントリスナー 29 30 TextView textViewX; //Z軸方向の加速度表示 31 TextView textViewY; //Z軸方向の加速度表示 32 TextView textViewZ; //Z軸方向の加速度表示 33 int Save = 0; 34 35 int UPDATE_INTERNAL = 10; //表示の変更間隔(ミリ秒) 36 long lastUpdate; 37 38 @Override 39 protected void onCreate(Bundle savedInstanceState) { 40 super.onCreate(savedInstanceState); 41 setContentView(R.layout.activity_main); 42 43 textViewX = (TextView)findViewById(R.id.textViewX); 44 textViewY = (TextView)findViewById(R.id.textViewY); 45 textViewZ = (TextView)findViewById(R.id.textViewZ); 46 47 // SensorManagerを取得する 48 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 49 50 // 加速度センサーを取得する 51 accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 52 53 if( accelSensor==null ){ 54 Toast.makeText(this, "加速度センサーが使えません", Toast.LENGTH_SHORT).show(); 55 } 56 } 57 58 @Override 59 protected void onResume(){ 60 super.onResume(); 61 if( accelSensor!=null ){ 62 // センサーのイベントリスナーをSensorManagerに登録する 63 mySensorEventListener = new MySensorEventListener(); 64 sensorManager.registerListener(mySensorEventListener, 65 accelSensor, SensorManager.SENSOR_DELAY_UI); 66 } 67 lastUpdate = System.currentTimeMillis(); 68 } 69 70 //センサー値が変化したときのイベントリスナー 71 class MySensorEventListener implements SensorEventListener{ 72 73 @Override 74 public void onSensorChanged(SensorEvent sensorEvent){ 75 76 Button buttonSave = findViewById(R.id.buttonSave); 77 Button buttonStop = findViewById(R.id.buttonStop); 78 79 buttonSave.setOnClickListener(new View.OnClickListener() { 80 @Override 81 public void onClick(View view) { 82 Save = 1; 83 } 84 }); 85 buttonStop.setOnClickListener(new View.OnClickListener() { 86 @Override 87 public void onClick(View view) { 88 Save = 0; 89 } 90 }); 91 92 if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ 93 //センサーのタイプが加速度センサーの場合の処理 94 long actualTime = System.currentTimeMillis(); 95 96 if(actualTime - lastUpdate > UPDATE_INTERNAL){ 97 lastUpdate = actualTime; 98 Timer timer = new Timer(false); 99 OutputStream out; 100 101 //センサーの値を取得する 102 float x =sensorEvent.values[0]; 103 float y =sensorEvent.values[1]; 104 float z =sensorEvent.values[2]; 105 106 //センサーの値を表示する 107 textViewX.setText("X: "+(x)); 108 textViewY.setText("Y: "+(y)); 109 textViewZ.setText("Z: "+(z)); 110 111 112 if (Save == 1){ 113 114 try { 115 out = openFileOutput("test001.csv",MODE_PRIVATE|MODE_APPEND); 116 PrintWriter writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8")); 117 writer.append((x)+(", ")+(y)+(", ")+(z)+("\n")); 118 writer.close(); 119 } catch (IOException e) { 120 121 e.printStackTrace(); 122 } 123 } 124 } 125 } 126 } 127 128 @Override 129 public void onAccuracyChanged(Sensor sensor, int i){ 130 131 } 132 } 133} 134

こちらの方法では、
マニフェストやDangerousパーミッション等を考えずに実行することができました。

投稿2019/12/16 06:25

Taiga_s

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

加速度値(Z軸)をSDカードにcsvファイルで保存する

どこぞの学校の宿題でしょうか
定期的に質問がきますけど

これに関してはいろいろ考えないといけません
Runtime Pwermission も必要です
パスを直接指定して書き込みできません

こちらが参考になるかもしれません
[Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGE

実際のSDカードに書き込むことは
別の問題がありますが
とりあえず外部ストレージ(端末内のストレージも含む)への書き込みです

投稿2019/12/11 07:12

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taiga_s

2019/12/14 08:27

ご回答ありがとうございます。 また、返信が遅くなり申し訳ございません。 色々と調べたところ、 マニフェストでDangerousパーミッションを指定した場合はその許可をユーザーにリクエストする処理が必要であることが分かりました。 ご提示いただいたサイト等を活用してやってみます。
guest

0

マニフェストに書き込むのはこちらでは?
READ(読む)→WRITE(書く)

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

投稿2019/12/11 01:06

HRSKT

総合スコア168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taiga_s

2019/12/11 01:10

見辛くて大変申し訳ありません。 マニフェストには READは書き込まずに、WRITEの方を書き込んで端末の設定でストレージ権限をONにしておりますが、 SDカードに保存できないでいる状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問