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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

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

Android

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

Q&A

1回答

1068閲覧

グローバル変数の取得が一度しか出来ない

3dmagicball

総合スコア6

Java

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

Android

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

0グッド

0クリップ

投稿2018/02/08 09:45

編集2018/02/13 04:08

前提・実現したいこと

Javaで、Androidのカメラプレビューを用いたアプリを作っています。
機能としては輝度値を取得し、一番明るい範囲を描画するものです。

グローバル変数を用いて、
明るい範囲をCanvasのViewに紐付けたいのですが、
グローバル変数の変更に一度しか対応してくれません。

理想としては5秒ごとに、
一番明るい範囲をリアルタイムで描画出来るような状態なのですが、

最初に取得した部分しか描画されません。

CanvasBasicViewのgetInt()を用いた取得方法に、
何か問題があるのではとは思っております。

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

グローバル変数の取得が一度しか出来ない ※2/13 追記 CameraViewのcntsvとCommonのkeyyyが変化する処理がずっとループしており、 再度getInt()することが出来ない

該当のソースコード

Java

1//描画するView 2public class CanvasBasicView extends View 3{ 4 Timer timer; 5 Canvas canvas; 6 Common common; 7 int keymain; 8 9 private Paint mPaint = new Paint() 10 11 public CanvasBasicView(Context context){ 12 super(context); 13 //インスタンス化 14 timer = new Timer(); 15 common = (Common)context.getApplicationContext(); 16 } 17 18 19 @Override 20 public void onDraw(final Canvas canvas) { 21 super.onDraw(canvas); 22 mPaint.setStyle(Paint.Style.STROKE) 23 24 //タイマー機能 25 timer.scheduleAtFixedRate(new TimerTask() { 26 @Override 27 public void run() { 28 //ここでKeyを取得 29 keymain = common.getInt(); 30 31 if(keymain==0){ 32 canvas.drawCircle(300, 1200, 100, mPaint); 33 } 34 if(keymain==1){ 35 canvas.drawCircle(900, 1200, 100, mPaint); 36 } 37 if(keymain==2){ 38 canvas.drawCircle(300, 500, 100, mPaint); 39 } 40 if(keymain==3){ 41 canvas.drawCircle(900, 500, 100, mPaint); 42 } 43 } 44 },500,3000); 45 } 46} 47

Java

1//グローバル変数を扱うための、クラス 2public class Common extends Application { 3 4 private int keyfin=0; 5 6 @Override 7 public void onCreate() { 8 super.onCreate(); 9 } 10 11 //keyの値を代入 12 public void setInt(int keyyy) { 13 keyfin=keyyy; 14 } 15 16 //keyの値を取得 17 public int getInt() { 18 return keyfin; 19 } 20}

Java

1public class CameraView extends SurfaceView 2 implements SurfaceHolder.Callback, Camera.PreviewCallback { 3 //カメラの縦横 640*480は標準的に動く 4 private static final int PREVIEW_WIDTH = 640; 5 private static final int PREVIEW_HEIGHT = 480; 6 private static final int FRAME_WIDTH = 50; 7 private static final int SCALE = 1; 8 private static final int VIEW_POINTS = 200; 9 private static final float PEN_WIDTH = 3.0F; 10 private int mBufSize; 11 private float[] mVal; 12 private int mSamples; 13 private int mTop; 14 private int mStep; 15 private Camera mCamera = null; 16 private SurfaceHolder mHolder = null; 17 private SurfaceTexture mSurfaceTexture = null; 18 String bbb ="hello_world"; 19 int keyfin = 0; 20 int cntsv ; 21 Timer timer; 22 23 24 Common common; 25 public int coun = 0; 26 public Paint paintf; 27 28 public Activity activity; 29 30 //CameraViewのメソッド 31 public CameraView(Context context) { 32 super(context); 33 34 mHolder = getHolder(); 35 mHolder.addCallback(this); 36 37 //ここでインスタンス化 38 common = (Common)context.getApplicationContext(); 39 timer = new Timer(); 40 } 41 42 //カメラ作成にはsurfaceが必要で、surfaceの作成 43 public void surfaceCreated(SurfaceHolder holder) { 44 // TODO Auto-generated method stub 45 46 //getWidthは画面サイズ取得 47 mBufSize = getWidth(); 48 mVal = new float[mBufSize]; 49 mStep = (mBufSize - FRAME_WIDTH * 2) / VIEW_POINTS; 50 51 // カメラオープン(カメラのインスタンスを取得) 52 mCamera = Camera.open(); 53 try { 54 mCamera.setPreviewDisplay(holder); 55 56 } catch (IOException e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 60 } 61 } 62 63 //surface変更時の処理 64 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 65 // TODO Auto-generated method stub 66 stopPreview(); 67 // プレビュー画面のサイズ設定 68 Camera.Parameters params = mCamera.getParameters(); 69 params.setPreviewSize(PREVIEW_WIDTH, PREVIEW_HEIGHT); 70 // params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 71 mCamera.setParameters(params); 72 // プレビュー開始 73 mTop = 0; 74 mSamples = 0; 75 startPreview(); 76 } 77 78 //surface破棄時の処理 79 public void surfaceDestroyed(SurfaceHolder holder) { 80 // TODO Auto-generated method stub 81 stopPreview(); 82 mCamera.release(); 83 mCamera = null; 84 } 85 86 //ここでdataを定義 87 @Override 88 public void onPreviewFrame(byte[] data, Camera camera) { 89 // TODO Auto-generated method stub 90 91 mVal[mSamples % mBufSize] = calcLuminance(data); 92 93 // else { 94 mSamples++; 95 // drawLuminance(); 96 } 97 98 // プレビュー開始 99 private void startPreview() { 100 mCamera.setPreviewCallback(this); 101 mCamera.startPreview(); 102 } 103 104 // プレビュー停止 105 private void stopPreview() { 106 mCamera.setPreviewCallback(null); 107 mCamera.stopPreview(); 108 } 109 110 // 輝度値の計算 "n"を箱として10個作る 111 float n[] = new float[10]; 112 113 private float calcLuminance(byte[] data) { 114 //時間計測開始 115 long start = System.currentTimeMillis(); 116 float sumVal1 = 0.0f; 117 float sumVal2 = 0.0f; 118 float sumVal3 = 0.0f; 119 float sumVal4 = 0.0f; 120 121 //cntはcountするだけのもの 122 int cnt = 0; 123 int cnt1 = 0; 124 int cnt2 = 0; 125 int cnt3 = 0; 126 int cnt4 = 0; 127 128 //この範囲からこの範囲での、輝度値を積分している 129 for (int y = PREVIEW_HEIGHT / 4 ; y < PREVIEW_HEIGHT * 3 / 8 ; y++) { 130 //widthを1/4(160)から3/4(480)まで回す 131 for (int x = PREVIEW_WIDTH / 4; x < PREVIEW_WIDTH * 3 / 8; x++) { 132 133 //1/4~3/4は範囲を設定しただけ(端末の大きさにより、変化するため) 134 //sumValは、画素値の合計値 135 136 sumVal1 = sumVal1 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff); 137 cnt1++; 138 139 } 140 } 141 142 //2回目 143 for (int y = PREVIEW_HEIGHT / 4 ; y < PREVIEW_HEIGHT * 3 / 8 ; y++) { 144 for (int x = PREVIEW_WIDTH * 3 / 8; x < PREVIEW_WIDTH * 3 / 4; x++) { 145 146 sumVal2 = sumVal2 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff); 147 cnt2++; 148 149 } 150 } 151 152 //3回目 153 for (int y = PREVIEW_HEIGHT * 3 / 8 ; y < PREVIEW_HEIGHT * 3 /4 ; y++) { 154 for (int x = PREVIEW_WIDTH / 4; x < PREVIEW_WIDTH * 3 / 8; x++) { 155 156 sumVal3 = sumVal3 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff); 157 cnt3++; 158 159 } 160 } 161 162 //4回目 163 for (int y = PREVIEW_HEIGHT * 3/ 8 ; y < PREVIEW_HEIGHT * 3 / 4 ; y++) { 164 for (int x = PREVIEW_WIDTH *3 / 8; x < PREVIEW_WIDTH * 3 / 4; x++) { 165 166 sumVal4 = sumVal4 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff); 167 cnt4++; 168 169 } 170 } 171 172 //合計値を、平均化している 173 sumVal1 = sumVal1/cnt1; 174 sumVal2 = sumVal2/cnt2; 175 sumVal3 = sumVal3/cnt3; 176 sumVal4 = sumVal4/cnt4; 177 178 //最大値を求めるコード 179 float sumValarray[]={sumVal1,sumVal2,sumVal3,sumVal4}; 180 //とりあえず0を入れた 181 float sumValmax=sumValarray[0]; 182 183 //sumValmaxを特定するループ 184 for(int i=0;i<sumValarray.length;i++){ 185 if(sumValarray[i]>=sumValmax){ 186 sumValmax= sumValarray[i]; 187 //keyを取得するためのcntsv 188 cntsv=i; 189 } 190 191// グローバル変数のset 192 common.setInt(cntsv); 193 194}

試したこと

Timerを用いて、一定時間ごとの処理

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

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

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

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

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

keicha_hrs

2018/02/08 11:17

提示されたコードにはCommon#setInt()を呼び出しているところが一箇所もないようですが、提示されていないところに存在するのでしょうか?
guest

回答1

0

Common#setInt()を含むコードの提示までいただき、ありがとうございます。setInt()の方法に問題があるのではないかと思いましたが、新たに提示していただいたコードを見てもよくわかりませんでした。

Commonの作り方やset、getの方法自体に問題があるとは思えません。曲がりなりにも動作しているのであれば、AndroidManifest.xmlへの記述忘れということもないのでしょう。setInt()の行にLogを入れるなりブレークポイントを設定してデバッグするなりして、様々な値が引数として渡されていることを確認するより他はないかと思います。

役に立たない回答で申し訳ありません。

投稿2018/02/10 05:38

keicha_hrs

総合スコア6768

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

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

3dmagicball

2018/02/13 02:42

ご返信ありがとうございます。 ブレークポイントでのデバックですと、CameraViewのcntsvとCommonのkeyyyが変わっていくのがずっとループしている状態でした。  ここのループがもしかしたら原因かもしれないので、引き続き原因を探してみます。 拙いコードにも関わらず、回答していただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問