diff --git a/app/build.gradle b/app/build.gradle index 0a5d645c32b761c500add9b745eddacbd77691e6..4627d8e5e552595b0c643439112cb1fd01b11207 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,4 +25,6 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + + implementation 'com.github.dongzhong:VideoPlayer:v1.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0330d0df4d6cb9078392ef74e5ecfc30783afcda..fd195ba7059aeed2235330c54f77ae278a9a12e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="dongzhong.testforfloatingwindow"> + + \ No newline at end of file diff --git a/app/src/main/java/dongzhong/testforfloatingwindow/FloatingVideoService.java b/app/src/main/java/dongzhong/testforfloatingwindow/FloatingVideoService.java new file mode 100644 index 0000000000000000000000000000000000000000..72dca4cf161833e222e83ff0b8168616702fc0e6 --- /dev/null +++ b/app/src/main/java/dongzhong/testforfloatingwindow/FloatingVideoService.java @@ -0,0 +1,103 @@ +package dongzhong.testforfloatingwindow; + +import android.app.Service; +import android.content.Intent; +import android.graphics.PixelFormat; +import android.os.Build; +import android.os.IBinder; +import android.provider.Settings; +import android.support.annotation.Nullable; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; + +import dongzhong.videoplayer.VideoPlayer; + +/** + * Created by admin on 2018/5/30. + */ + +public class FloatingVideoService extends Service { + public static boolean isStarted = false; + + private WindowManager windowManager; + private WindowManager.LayoutParams layoutParams; + + private View displayView; + + @Override + public void onCreate() { + super.onCreate(); + isStarted = true; + windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + layoutParams = new WindowManager.LayoutParams(); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { + layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; + } + layoutParams.format = PixelFormat.RGBA_8888; + layoutParams.gravity = Gravity.LEFT | Gravity.TOP; + layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + layoutParams.width = 800; + layoutParams.height = 450; + layoutParams.x = 300; + layoutParams.y = 300; + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + showFloatingWindow(); + return super.onStartCommand(intent, flags, startId); + } + + private void showFloatingWindow() { + if (Settings.canDrawOverlays(this)) { + LayoutInflater layoutInflater = LayoutInflater.from(this); + displayView = layoutInflater.inflate(R.layout.video_display, null); + VideoPlayer videoPlayer = displayView.findViewById(R.id.videoplayer_display); + videoPlayer.preset("https://raw.githubusercontent.com/dongzhong/ImageAndVideoStore/master/Bruno%20Mars%20-%20Treasure.mp4", + "Treasure - Bruno Mars", true); + windowManager.addView(displayView, layoutParams); + + displayView.setOnTouchListener(new FloatingOnTouchListener()); + } + } + + private class FloatingOnTouchListener implements View.OnTouchListener { + private int x; + private int y; + + @Override + public boolean onTouch(View view, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + x = (int) event.getRawX(); + y = (int) event.getRawY(); + break; + case MotionEvent.ACTION_MOVE: + int nowX = (int) event.getRawX(); + int nowY = (int) event.getRawY(); + int movedX = nowX - x; + int movedY = nowY - y; + x = nowX; + y = nowY; + layoutParams.x = layoutParams.x + movedX; + layoutParams.y = layoutParams.y + movedY; + windowManager.updateViewLayout(view, layoutParams); + break; + default: + break; + } + return false; + } + } +} diff --git a/app/src/main/java/dongzhong/testforfloatingwindow/MainActivity.java b/app/src/main/java/dongzhong/testforfloatingwindow/MainActivity.java index 1b1c176585af65a1a4115f611ed1fcc78c3ecf36..8d753381094cdbe5fd5c7ec93923134befc12d85 100644 --- a/app/src/main/java/dongzhong/testforfloatingwindow/MainActivity.java +++ b/app/src/main/java/dongzhong/testforfloatingwindow/MainActivity.java @@ -32,6 +32,13 @@ public class MainActivity extends AppCompatActivity { Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show(); startService(new Intent(MainActivity.this, FloatingImageDisplayService.class)); } + } else if (requestCode == 2) { + if (!Settings.canDrawOverlays(this)) { + Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show(); + startService(new Intent(MainActivity.this, FloatingVideoService.class)); + } } } @@ -58,4 +65,16 @@ public class MainActivity extends AppCompatActivity { startService(new Intent(MainActivity.this, FloatingImageDisplayService.class)); } } + + public void startFloatingVideoService(View view) { + if (FloatingVideoService.isStarted) { + return; + } + if (!Settings.canDrawOverlays(this)) { + Toast.makeText(this, "当前无权限,请授权", Toast.LENGTH_SHORT); + startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 2); + } else { + startService(new Intent(MainActivity.this, FloatingVideoService.class)); + } + } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8d6ea01643c65e30928b210a14cc8f9a949b8a8d..39e120d577c03accd0b2ed60be55e1577476c0ce 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -17,4 +17,10 @@ android:text="start floating image display" android:onClick="startFloatingImageDisplayService"/> +