Firefly开源社区

Android 实现"透明屏幕"

117

积分

1

威望

0

贡献

技术小白

积分
117
发表于 2017-5-12 15:15:55     
我在 Google Play 上看到一个挺有意思的app:

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

看着有点酷的样子,试着实现一下.
最终实现效果
效果
实现步骤

    AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.           package="con.song.wallpaper">
  4.     <uses-permission android:name="android.permission.CAMERA"/>
  5.     <uses-permission android:name="android.permission.SET_WALLPAPER"/>
  6.     <application
  7.         android:allowBackup="true"
  8.         android:icon="@mipmap/ic_launcher"
  9.         android:label="@string/app_name"
  10.         android:supportsRtl="true"
  11.         android:theme="@style/AppTheme">
  12.         <activity android:name=".MainActivity">
  13.             <intent-filter>
  14.                 <action android:name="android.intent.action.MAIN"/>
  15.                 <category android:name="android.intent.category.LAUNCHER"/>
  16.             </intent-filter>
  17.         </activity>
  18.         <!-- 配置实时壁纸Service -->
  19.         <service android:label="@string/app_name"
  20.                  android:name=".CameraLiveWallpaper"
  21.                  android:permission="android.permission.BIND_WALLPAPER">
  22.             <!-- 为实时壁纸配置intent-filter -->
  23.             <intent-filter>
  24.                 <action  android:name="android.service.wallpaper.WallpaperService" />
  25.             </intent-filter>
  26.             <!-- 为实时壁纸配置meta-data -->
  27.             <meta-data android:name="android.service.wallpaper"
  28.                        android:resource="@xml/livewallpaper" />
  29.         </service>
  30.     </application>

  31. </manifest>
复制代码
在res下面新建一个xml文件夹 然后新建一个livewallpaper.xml 内容如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- ic_launcher 预览是显示的图片-->
  3. <wallpaper
  4.   xmlns:android="http://schemas.android.com/apk/res/android"
  5.   android:thumbnail="@mipmap/ic_launcher"/>
复制代码
实现动态壁纸的LiveWallpaper.java:
  1. package con.song.wallpaper;

  2. import android.hardware.Camera;
  3. import android.service.wallpaper.WallpaperService;
  4. import android.view.MotionEvent;
  5. import android.view.SurfaceHolder;

  6. import java.io.IOException;

  7. public class CameraLiveWallpaper extends WallpaperService {
  8.     // 实现WallpaperService必须实现的抽象方法  
  9.     public Engine onCreateEngine() {
  10.         // 返回自定义的CameraEngine  
  11.         return new CameraEngine();
  12.     }

  13.     class CameraEngine extends Engine implements Camera.PreviewCallback {
  14.         private Camera camera;

  15.         @Override
  16.         public void onCreate(SurfaceHolder surfaceHolder) {
  17.             super.onCreate(surfaceHolder);

  18.             startPreview();
  19.             // 设置处理触摸事件  
  20.             setTouchEventsEnabled(true);

  21.         }

  22.         @Override
  23.         public void onTouchEvent(MotionEvent event) {
  24.             super.onTouchEvent(event);
  25.             // 时间处理:点击拍照,长按拍照
  26.         }

  27.         @Override
  28.         public void onDestroy() {
  29.             super.onDestroy();
  30.             stopPreview();
  31.         }

  32.         @Override
  33.         public void onVisibilityChanged(boolean visible) {
  34.             if (visible) {
  35.                 startPreview();
  36.             } else {
  37.                 stopPreview();
  38.             }
  39.         }

  40.         /**
  41.          * 开始预览
  42.          */
  43.         public void startPreview() {
  44.             camera = Camera.open();
  45.             camera.setDisplayOrientation(90);

  46.             try {
  47.                 camera.setPreviewDisplay(getSurfaceHolder());
  48.             } catch (IOException e) {
  49.                 e.printStackTrace();
  50.             }
  51.             camera.startPreview();

  52.         }

  53.         /**
  54.          * 停止预览
  55.          */
  56.         public void stopPreview() {
  57.             if (camera != null) {
  58.                 try {
  59.                     camera.stopPreview();
  60.                     camera.setPreviewCallback(null);
  61.                     // camera.lock();
  62.                     camera.release();
  63.                 } catch (Exception e) {
  64.                     e.printStackTrace();
  65.                 }
  66.                 camera = null;
  67.             }
  68.         }

  69.         @Override
  70.         public void onPreviewFrame(byte[] bytes, Camera camera) {
  71.             camera.addCallbackBuffer(bytes);
  72.         }
  73.     }
  74. }
复制代码
启动动态壁纸的MainActivity.java:
  1. package con.song.wallpaper;

  2. import android.Manifest;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.pm.PackageManager;
  6. import android.os.Bundle;
  7. import android.support.annotation.NonNull;
  8. import android.support.v4.app.ActivityCompat;
  9. import android.support.v4.content.ContextCompat;
  10. import android.support.v7.app.AppCompatActivity;
  11. import android.view.View;
  12. import android.widget.Toast;


  13. public class MainActivity extends AppCompatActivity {

  14.     private static final int PERMISSIONS_REQUEST_CAMERA = 454;
  15.     private Context mContext;
  16.     static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;

  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_main);
  21.         mContext = this;
  22.         findViewById(R.id.text)
  23.                 .setOnClickListener(new View.OnClickListener() {
  24.                     @Override
  25.                     public void onClick(View view) {
  26.                         checkSelfPermission();
  27.                     }
  28.                 });
  29.     }

  30.     /**
  31.      * 检查权限
  32.      */
  33.     void checkSelfPermission() {
  34.         if (ContextCompat.checkSelfPermission(mContext, PERMISSION_CAMERA) != PackageManager.PERMISSION_GRANTED) {
  35.             ActivityCompat.requestPermissions(this,
  36.                     new String[]{PERMISSION_CAMERA},
  37.                     PERMISSIONS_REQUEST_CAMERA);
  38.         } else {
  39. //            setTransparentWallpaper();
  40.             startWallpaper();
  41.         }
  42.     }

  43.     @Override
  44.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  45.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  46.         switch (requestCode) {
  47.             case PERMISSIONS_REQUEST_CAMERA: {
  48.                 // If request is cancelled, the result arrays are empty.
  49.                 if (grantResults.length > 0
  50.                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  51. //                    setTransparentWallpaper();
  52.                     startWallpaper();

  53.                 } else {
  54.                     Toast.makeText(mContext, getString(R.string._lease_open_permissions), Toast.LENGTH_SHORT).show();
  55.                 }
  56.                 return;
  57.             }
  58.         }
  59.     }
  60.     /**
  61.      * 选择壁纸
  62.      */
  63.     void startWallpaper() {
  64.         final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
  65.         Intent chooser = Intent.createChooser(pickWallpaper, getString(R.string.choose_wallpaper));
  66.         startActivity(chooser);
  67.     }

  68.     /**
  69.      * 不需要手动启动服务
  70.      */
  71.     void setTransparentWallpaper() {
  72.         startService(new Intent(mContext, CameraLiveWallpaper.class));
  73.     }
  74. }
复制代码
这样一个简单装逼神器出来了...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表