前提・実現したいこと
以下のようなAndroidアプリを作りたいと思っています。
1)Serviceを使ってオーバレイのボタンを配置し、そのボタンを押すことでスクショを取ります。
2)スクショの中に指定した画像を見つけます。
3)見つけた領域に矩形などをオーバレイ表示する。
発生している問題・エラーメッセージ
1)は、色々なサイトを参考に、WindowManager、MediaProjectionManagerなどを使用して
何とか作成することができたと思います。
2)はビットマップからRGBを抽出し、座標、大きさは取得できました。
※正しくは、抽出するロジックはまだこれからなので、調べたい領域を抜き出すところまでです。
3)において、調べたい領域が正しく抜き出されているのかを確認する意味で、
その矩形をオーバレイ上に追加したいのですが、この方法がわかりません。
Java初心者で見様見真似で作っているので、理解できていないところが多く
見当違いなことを書いているかもしれませんが、解決方法についてご教授お願いいたします。
該当のソースコード
Java
1 @Override 2 public int onStartCommand(Intent intent, int flags, int startId){ 3 super.onStartCommand(intent, flags, startId); 4 5 LayoutInflater layoutInflater = LayoutInflater.from(this); 6 7 WindowManager.LayoutParams params = null; 8 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { 9 params = new WindowManager.LayoutParams( 10 WindowManager.LayoutParams.WRAP_CONTENT, 11 WindowManager.LayoutParams.WRAP_CONTENT, 12 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, 13 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 14 WindowManager.LayoutParams.FLAG_FULLSCREEN | 15 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 16 PixelFormat.TRANSLUCENT); 17 }else 18 { 19 params = new WindowManager.LayoutParams( 20 WindowManager.LayoutParams.WRAP_CONTENT, 21 WindowManager.LayoutParams.WRAP_CONTENT, 22 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 23 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 24 WindowManager.LayoutParams.FLAG_FULLSCREEN | 25 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 26 PixelFormat.TRANSLUCENT); 27 } 28 29 wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 30 31 view = layoutInflater.inflate(R.layout.overlay, null); 32 33 params.gravity= Gravity.TOP | Gravity.CENTER; 34 35 View.OnClickListener buttonClickListener = new View.OnClickListener() { 36 @Override 37 public void onClick(View view) { 38 switch(view.getId()) { 39 case R.id.start: 40 41 // 画面の縦横サイズとdpを取得 42 DisplayMetrics displayMetrics = new DisplayMetrics(); 43 wm.getDefaultDisplay().getMetrics(displayMetrics); 44 screenDensity = displayMetrics.densityDpi; 45 displayWidth = displayMetrics.widthPixels; 46 displayHeight = displayMetrics.heightPixels; 47 48 imageReader = ImageReader.newInstance( 49 displayWidth, displayHeight, PixelFormat.RGBA_8888, 2); 50 51 virtualDisplay = MainActivity.mProjection.createVirtualDisplay("ScreenCapture", 52 displayWidth, displayHeight, screenDensity, 53 DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, 54 imageReader.getSurface(), null, null); 55 56 //スクリーンショット取得 57 Bitmap btMap = getScreenshot(); 58 //Bitmapの解析 59 BitmapAnalyze test = new BitmapAnalyze(); 60 Rect rect1; 61 //抽出された領域の取得 62 rect1 = test.AreaKettei(btMap); 63 //■■■■■■■■■■■■■■■■■■■■■ここに記述?? 64 //2018.08.02追記 ===> 65 AnalyzeResultView AnalyzeResult = new AnalyzeResultView(getApplicationContext()); 66 AnalyzeResult.setAnalyzeResult(rect1); 67 //<===2018.08.02追記 68 break; 69 case R.id.stop: 70 stopSelf(); 71 Intent intent2 = new Intent(getApplication(), MainActivity.class); 72 startActivity(intent2); 73 break; 74 } 75 } 76 }; 77 view.findViewById(R.id.start).setOnClickListener(buttonClickListener); 78 view.findViewById(R.id.stop).setOnClickListener(buttonClickListener); 79 80 wm.addView(view, params); 81 82 return START_STICKY; 83 } 84
試したこと
「ここに記述??」と書いたところにに何かを記載すればいいのかなと思うのですが、
実現方法がわかりません。
⇒ 2018/08/02追記
ご記載いただいたカスタムViewを作成し、上記ソースにも追記して呼び出してみたのですが、
onDrawが呼ばれない現象になりました。
こちらを解消する方法はありますでしょうか?
Java
1public class AnalyzeResultView extends View { 2 3 private Rect rect = null; 4 private Paint mPaint = new Paint(); 5 6 public AnalyzeResultView(Context context) { 7 super(context); 8 setWillNotDraw(false); 9 } 10 11 // 結果をセットし描画を更新するためのメソッド 12 public void setAnalyzeResult(Rect rect) { 13 this.rect = rect; 14 postInvalidate(); 15 16 } 17 18 @Override 19 public void onDraw(Canvas canvas) { 20 super.onDraw(canvas); 21 22 mPaint.setAntiAlias(true); 23 mPaint.setStrokeWidth(1); 24 mPaint.setStyle(Paint.Style.STROKE); 25 26 mPaint.setColor(Color.YELLOW); 27 // 矩形の描画処理... 28 canvas.drawRect(rect,mPaint); 29 } 30 31} 32
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/01 17:01
2018/08/01 17:22 編集
2018/08/02 17:17
2018/08/02 22:46
2018/08/03 16:20
2018/08/03 17:25
2018/08/04 15:01
2018/08/05 15:53