Android 实现"透明屏幕"

作者: songx | 来源:发表于2017-05-09 10:58 被阅读6619次

    前言

    我在 Google Play 上看到一个挺有意思的app:

    Url : https://play.google.com/store/apps/details?id=com.m2c.studio.transparent.screen

    看着有点酷的样子,试着实现一下.

    最终实现效果

    效果

    实现步骤

    • AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="con.song.wallpaper">
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-permission android:name="android.permission.SET_WALLPAPER"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <!-- 配置实时壁纸Service -->
            <service android:label="@string/app_name"
                     android:name=".CameraLiveWallpaper"
                     android:permission="android.permission.BIND_WALLPAPER">
                <!-- 为实时壁纸配置intent-filter -->
                <intent-filter>
                    <action  android:name="android.service.wallpaper.WallpaperService" />
                </intent-filter>
                <!-- 为实时壁纸配置meta-data -->
                <meta-data android:name="android.service.wallpaper"
                           android:resource="@xml/livewallpaper" />
            </service>
        </application>
    
    </manifest>
    
    • 在res下面新建一个xml文件夹 然后新建一个livewallpaper.xml 内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <!-- ic_launcher 预览是显示的图片-->
    <wallpaper
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:thumbnail="@mipmap/ic_launcher"/>
    
    • 实现动态壁纸的LiveWallpaper.java:
    package con.song.wallpaper;
    
    import android.hardware.Camera;
    import android.service.wallpaper.WallpaperService;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    
    import java.io.IOException;
    
    public class CameraLiveWallpaper extends WallpaperService {
        // 实现WallpaperService必须实现的抽象方法  
        public Engine onCreateEngine() {
            // 返回自定义的CameraEngine  
            return new CameraEngine();
        }
    
        class CameraEngine extends Engine implements Camera.PreviewCallback {
            private Camera camera;
    
            @Override
            public void onCreate(SurfaceHolder surfaceHolder) {
                super.onCreate(surfaceHolder);
    
                startPreview();
                // 设置处理触摸事件  
                setTouchEventsEnabled(true);
    
            }
    
            @Override
            public void onTouchEvent(MotionEvent event) {
                super.onTouchEvent(event);
                // 时间处理:点击拍照,长按拍照
            }
    
            @Override
            public void onDestroy() {
                super.onDestroy();
                stopPreview();
            }
    
            @Override
            public void onVisibilityChanged(boolean visible) {
                if (visible) {
                    startPreview();
                } else {
                    stopPreview();
                }
            }
    
            /**
             * 开始预览
             */
            public void startPreview() {
                camera = Camera.open();
                camera.setDisplayOrientation(90);
    
                try {
                    camera.setPreviewDisplay(getSurfaceHolder());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                camera.startPreview();
    
            }
    
            /**
             * 停止预览
             */
            public void stopPreview() {
                if (camera != null) {
                    try {
                        camera.stopPreview();
                        camera.setPreviewCallback(null);
                        // camera.lock();
                        camera.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    camera = null;
                }
            }
    
            @Override
            public void onPreviewFrame(byte[] bytes, Camera camera) {
                camera.addCallbackBuffer(bytes);
            }
        }
    }  
    
    • 启动动态壁纸的MainActivity.java:
    package con.song.wallpaper;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Toast;
    
    
    public class MainActivity extends AppCompatActivity {
    
        private static final int PERMISSIONS_REQUEST_CAMERA = 454;
        private Context mContext;
        static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = this;
            findViewById(R.id.text)
                    .setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            checkSelfPermission();
                        }
                    });
        }
    
        /**
         * 检查权限
         */
        void checkSelfPermission() {
            if (ContextCompat.checkSelfPermission(mContext, PERMISSION_CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        new String[]{PERMISSION_CAMERA},
                        PERMISSIONS_REQUEST_CAMERA);
            } else {
    //            setTransparentWallpaper();
                startWallpaper();
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case PERMISSIONS_REQUEST_CAMERA: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    //                    setTransparentWallpaper();
                        startWallpaper();
    
                    } else {
                        Toast.makeText(mContext, getString(R.string._lease_open_permissions), Toast.LENGTH_SHORT).show();
                    }
                    return;
                }
            }
        }
        /**
         * 选择壁纸
         */
        void startWallpaper() {
            final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
            Intent chooser = Intent.createChooser(pickWallpaper, getString(R.string.choose_wallpaper));
            startActivity(chooser);
        }
    
        /**
         * 不需要手动启动服务
         */
        void setTransparentWallpaper() {
            startService(new Intent(mContext, CameraLiveWallpaper.class));
        }
    }
    
    

    这样一个简单装逼神器出来了...

    偶尔装下逼

    github: https://github.com/songixan/Wallpaper

    其他资料

    • 壁纸

    http://blog.csdn.net/t12x3456/article/details/7857741
    https://www.diycode.cc/topics/334
    http://www.qingpingshan.com/rjbc/az/232984.html
    http://mzh3344258.blog.51cto.com/1823534/806560/
    https://my.oschina.net/u/1770617/blog/339881

    • 相机

    https://github.com/google/cameraview
    https://github.com/afollestad/material-camera

    相关文章

      网友评论

      • xiasuhuei321:可以可以,很6,我也试了一下,可以考虑把相机完善一点,自动聚焦啥的。
        xiasuhuei321:@songx :flushed::flushed:
        songx::flushed: 我是把代码精简了,对不对焦用处不大..
        xiasuhuei321: Camera.Parameters parameters = camera.getParameters();
        // 设置聚焦
        if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 连续对焦模式
        }
        camera.setParameters(params);
        加上这几句效果会好点
      • BinZzz:代码实测可用66哒,只是有些手机并不能加载壁纸出不来
        我的锤子手机:smile:
        同事的小米实测可用
        无味之味:啊哈哈哈
        BinZzz:@songx 死变态楼主,我是汉子:cold_sweat: 系统预存有两张动态壁纸,理论上来说是可以的
        songx:大家快来围观,发现程序媛!! 锤子的在我的记忆中不能用动态壁纸的。
      • devdabug:Fail to connect to camera service
      • 学海无涯2016:用华为手机测试,根本没有效果。运行起来,只能设置壁纸。

        用你Github上的代码试了。
        学海无涯2016:@songx 小米note pro 和华为mate 7都试了了啊。 用的你GitHub上的代码也是一样。 我还以为我本地写的demo有问题。
        songx:兼容方面没测过,什么型号?动态壁纸是通过 SurfaceHolder 来绘制的,你试试绘制其他形状,比如圈圈什么的 , 可按照他的绘制方法: http://blog.csdn.net/t12x3456/article/details/7857741
      • 不会上树的猴子:怎么可能看得到自己的手呢?原来国外虚假宣传也很严重哦!
        songx:哈哈,我只是实现他真正运行后的效果。要做出效果图,我是无能为力的。
      • 吧主:不错,支持一下,加油😀
        songx:哈哈,
      • 哈喽樊樊:动态壁纸一直在加载。。。download 的源码提示句柄错误 :joy:
        songx:兼容方面没测过,什么型号?动态壁纸是通过 SurfaceHolder 来绘制的,你试试绘制其他形状,比如圈圈什么的 , 可按照他的绘制方法: http://blog.csdn.net/t12x3456/article/details/7857741
        哈喽樊樊:有测试机是黑屏,有的是一直在加载:flushed:
      • 有点健忘:咋把这壁纸取消,我只能杀死app才行?而且这只能app活着才有效吗?求解答,谢谢
        有点健忘:@songx 谢谢,看了下,就靠那SurfaceHolder 来操作了,自己随意往上边画啥都行,^_^
        songx:取消壁纸:设置其他壁纸就行了;
        动态壁纸是依靠服务来绘制内容的,你杀死了服务绘制也就停止了; WallpaperService 内部有个 SurfaceHolder ,SurfaceHolder 可以实现播放视频 ,录制视频 ,游戏 ,动画 都可以实现
      • 哦也好:实际意义不大好像
        songx:实际上用处不大,做来玩的,googlepay 上他的下载量 388,373,就这么简单的app,加上广告,就可以赚钱了,一个好的想法和好的UI是很重要的.
      • Jdqm:开着相机能看到手指,开玩笑
      • 小呀么小黄鸡:可以 这很装逼
      • 526846716f8c:卡死 - -
        songx:因为一直开相机,而已很耗电.这个只是玩玩而已.

      本文标题:Android 实现"透明屏幕"

      本文链接:https://www.haomeiwen.com/subject/iiybtxtx.html