From ea6ce17bf3272259295adccbad85583079b5bac0 Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Wed, 22 Feb 2023 14:14:41 +0000 Subject: [PATCH] api调用 --- app/src/main/java/com/auto/lyric/service/FloatingWindowService.java | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 205 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java index 720e9e6..a2fc685 100644 --- a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java +++ b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java @@ -1,11 +1,15 @@ package com.auto.lyric.service; import android.app.Service; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Build; import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.Gravity; @@ -16,11 +20,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.view.LayoutInflaterFactory; import com.auto.lyric.R; +import com.auto.lyric.data.LyricObject; +import com.auto.lyric.data.LyricServer; import com.auto.lyric.databinding.FloatViewBinding; import com.auto.lyric.util.DeviceUtil; + +import java.lang.ref.WeakReference; +import java.text.SimpleDateFormat; +import java.util.Timer; +import java.util.TimerTask; /** * 全局悬浮窗 @@ -31,9 +41,39 @@ private WindowManager manager; private WindowManager.LayoutParams params; FloatViewBinding binding; - Handler handler; final String TAG = "FloatingWindowService"; + final int THREAD_STOP = 99, KEYBOARD_SEND = 100; + SimpleDateFormat msFormat = new SimpleDateFormat("mm:ss.SSS"); + boolean pause;//是否暂停 + int progress;//时间进度 + LyricObject lyricObject;//当前发送过的歌词 + MyHandler handler ; + //计时器 + Timer timer = new Timer(); + //计时器执行任务 + class ServiceTask extends TimerTask{ + @Override + public void run() { + int index = binding.lyric.getIndex(progress+=10); + handler.sendMessage(new Message()); + if(lyricObject == null || lyricObject != LyricServer.getLrc_map().get(index)){ + lyricObject = LyricServer.getLrc_map().get(index); + Message message = new Message(); + message.what = KEYBOARD_SEND; + message.obj = lyricObject.lrc; + boolean flag = handler.sendMessage(message); + Log.e(TAG,"sendmessge "+message.obj +" 发送成功:"+flag); + } + //停止 + if(index == LyricServer.getLrc_map().size()-1){ + Message stop = new Message(); + stop.what = THREAD_STOP; + boolean flag = handler.sendMessage(stop); + Log.e(TAG,"sendEmptyMessage THREAD_STOP 发送成功:"+flag); + } + } + }; @Override public void onCreate() { super.onCreate(); @@ -47,21 +87,16 @@ }else { params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } + binding.btnBack.setEnabled(false); + binding.btnFast.setEnabled(false); + binding.btnPause.setEnabled(false); params.format = PixelFormat.RGBA_8888; params.gravity = Gravity.LEFT | Gravity.TOP; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = DeviceUtil.convertDpToPixel(200,getBaseContext()); - handler = new Handler(this.getMainLooper()){ - @Override - public void handleMessage(@NonNull Message msg) { - binding.lyric.setText(msg.obj.toString()); - int offset = binding.lyric.getLineCount() * binding.lyric.getLineHeight(); - - } - }; binding.close.setOnClickListener(v ->{ - stopService(new Intent(this,this.getClass())); + stopService(new Intent(this,FloatingWindowService.class)); stopService(new Intent(this,AutoInputService.class)); }); binding.floating.setOnTouchListener(new View.OnTouchListener() { @@ -75,14 +110,34 @@ || event.getAction() == MotionEvent.ACTION_UP){ params.y = (int) event.getRawY() - DeviceUtil.getStatusBarHeight(getBaseContext()) - startY; manager.updateViewLayout(binding.getRoot(), params); - Log.e(TAG,"ACTION_MOVE V:"+params.y); + //Log.e(TAG,"ACTION_MOVE V:"+params.y); } - Log.e(TAG,"onTouch event:"+event); - Log.e(TAG,"onTouch getRawY:"+event.getRawY()); +// Log.e(TAG,"onTouch event:"+event); +// Log.e(TAG,"onTouch getRawY:"+event.getRawY()); return true; } }); + binding.btnPause.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(pause){ + start(); + }else{ + pause(); + } + } + }); + binding.btnFast.setOnClickListener(v -> progress+=700); + binding.btnBack.setOnClickListener(v -> progress-=700); + binding.btnStart.setOnClickListener(v -> { + if(binding.btnStart.getText().equals("开启")){ + start(); + }else{ + stop(); + } + }); + handler = new MyHandler(Looper.getMainLooper(),this); } @Nullable @@ -91,10 +146,54 @@ return null; } + @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG,"onStartCommand flags:"+flags+" startId:"+startId+ " intent:"+intent); - manager.addView(binding.getRoot(),params); + if(binding.getRoot().getParent() == null) { + manager.addView(binding.getRoot(), params); + } + binding.lyric.setTextSize(); + stop(); + progress = LyricServer.getLrc_map().get(0).begintime; + binding.timer.setText(msFormat.format(progress)); + int index = binding.lyric.getIndex(progress); + binding.lyric.setOffsetY(220 - index * (binding.lyric.getSIZEWORD() + 44)); + binding.lyric.invalidate(); + binding.lyric.setOnTouchListener(new View.OnTouchListener() { + float touchY; //当触摸歌词View时,保存为当前触点的Y轴坐标 + @Override + public boolean onTouch(View v, MotionEvent event) { + float tt=event.getY(); + switch(event.getAction()){ + case MotionEvent.ACTION_DOWN: + break; + case MotionEvent.ACTION_MOVE: + touchY=tt-touchY; + binding.lyric.setOffsetY(binding.lyric.getOffsetY()+touchY); + //Log.e("LyricView","offsety:"+binding.lyric.getOffsetY()); + binding.lyric.invalidate(); + break; + case MotionEvent.ACTION_UP: + if(binding.btnStart.getText().equals("开启") || pause) { + int index = binding.lyric.getIndexFromOffsetY(binding.lyric.getOffsetY()); + LyricObject lyricObject = LyricServer.getLrc_map().get(index); + //Log.e("LyricView", "index:"+index+" object:" + lyricObject); + if(lyricObject != null) { + binding.lyric.setIndex(index); + binding.lyric.setOffsetY(220 - index * (binding.lyric.getSIZEWORD() + 44)); + //Log.e("LyricView", "object:" + lyricObject); + progress = lyricObject.begintime; + binding.timer.setText(msFormat.format(progress)); + } + binding.lyric.invalidate(); + } + break; + } + touchY=tt; + return true; + } + }); return super.onStartCommand(intent, flags, startId); } @@ -102,7 +201,97 @@ public void onDestroy() { super.onDestroy(); Log.e(TAG,"onDestroy "); + try { + timer.cancel(); + }catch (Exception e){} + AutoInputService.flag = false; + pause = true; manager.removeView(binding.getRoot()); - } + + /** + * 开始 + */ + private void start(){ + AutoInputService.flag = true; + pause = false; + try { + timer.cancel(); + }catch (Exception e){} + timer = new Timer(); + timer.schedule(new ServiceTask(),0,10); + binding.btnStart.setText("停止"); + binding.btnPause.setText("暂停"); + binding.btnBack.setEnabled(true); + binding.btnFast.setEnabled(true); + binding.btnPause.setEnabled(true); + Intent intent = new Intent(); + intent.setAction(AutoInputService.class.getName()); + intent.putExtra("action",AutoInputService.ACTION_START); + sendBroadcast(intent); + } + + private void pause(){ + try { + timer.cancel(); + }catch (Exception e){} + pause = true; + AutoInputService.flag = false; + binding.btnBack.setEnabled(false); + binding.btnFast.setEnabled(false); + binding.btnPause.setText("继续"); + } + + private void stop(){ + pause(); + progress = LyricServer.getLrc_map().get(0).begintime; + binding.btnStart.setText("开启"); + binding.btnPause.setEnabled(false); + } + + + //复制 + private void copy(String data) { + Log.e(TAG,"copy "+data); + // 获取系统剪贴板 + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + // 创建一个剪贴数据集,包含一个普通文本数据条目(需要复制的数据),其他的还有 + ClipData clipData = ClipData.newPlainText(null, data); + // 把数据集设置(复制)到剪贴板 + clipboard.setPrimaryClip(clipData); + } + + class MyHandler extends Handler{ + + private final WeakReference<FloatingWindowService> weakReference; + + MyHandler(Looper looper,FloatingWindowService service) { + super(looper); + this.weakReference = new WeakReference<>(service); + } + + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if(msg.what == THREAD_STOP){//停止 + stop(); + }else if(msg.what == KEYBOARD_SEND){//发送文本 + copy(msg.obj.toString()); + Intent intent = new Intent(); + intent.setAction(AutoInputService.class.getName()); + intent.putExtra("action",AutoInputService.ACTION_PASTE); + sendBroadcast(intent); + intent.putExtra("action",AutoInputService.ACTION_SEND); + sendBroadcast(intent); + }else if(msg.what == -1){//显示在输入框中 + + //Toast.makeText(getBaseContext(),"上一句--"+msg.obj,Toast.LENGTH_SHORT).show(); + } + int index = binding.lyric.getIndex(progress); + binding.lyric.setOffsetY(220 - index * (binding.lyric.getSIZEWORD() + 44)); + binding.lyric.invalidate(); + weakReference.get().binding.timer.setText(msFormat.format(progress)); + } + } + } -- Gitblit v1.9.1