android byte[] 转string 好多问号_Android 仿抖音实现动态壁纸
code小生,一個(gè)專注 Android 領(lǐng)域的技術(shù)平臺(tái)
公眾號(hào)回復(fù) Android 加入我的安卓技術(shù)群
作者:7_px
鏈接:https://www.jianshu.com/p/fc5cf284abbb
聲明:本文已獲7_px授權(quán)發(fā)表,轉(zhuǎn)發(fā)等請(qǐng)聯(lián)系原作者授權(quán)
一、概述:
壁紙運(yùn)行在一個(gè)Android服務(wù)之中,這個(gè)服務(wù)的名字叫做WallpaperService。當(dāng)用戶選擇了一個(gè)壁紙之后,此壁紙所對(duì)應(yīng)的WallpaperService便會(huì)啟動(dòng)并開(kāi)始進(jìn)行壁紙的繪制工作。
Engine是WallpaperService中的一個(gè)內(nèi)部類,實(shí)現(xiàn)了壁紙窗口的創(chuàng)建以及Surface的維護(hù)工作。Engine內(nèi)部實(shí)現(xiàn)了SurfaceView,我們只需要在其內(nèi)部利用MediaPlayer + SurfaceView就可以播放動(dòng)態(tài)壁紙了。
二、實(shí)現(xiàn):
WallpaperService需要一個(gè)xml去配置,然后在AndroidManifest.xml中聲明
<wallpaper?xmlns:android="http://schemas.android.com/apk/res/android"android:thumbnail="@mipmap/icon_lacation_black___cm">wallpaper>
繼承WallpaperService實(shí)現(xiàn)我們自己的壁紙服務(wù)VideoLiveWallpaper
public?class?VideoLiveWallpaper?extends?WallpaperService?{????@Override
????public?Engine?onCreateEngine()?{
????????return?new?VideoEngine();
????}
????class?VideoEngine?extends?Engine?{
????????private?MediaPlayer?mMediaPlayer;
????????@Override
????????public?void?onCreate(SurfaceHolder?surfaceHolder)?{
????????????super.onCreate(surfaceHolder);
????????}
????????@Override
????????public?void?onDestroy()?{
????????????super.onDestroy();
????????}
????????@Override
????????public?void?onSurfaceCreated(SurfaceHolder?holder)?{
????????????super.onSurfaceCreated(holder);
????????????mMediaPlayer?=?new?MediaPlayer();
????????????mMediaPlayer.setSurface(holder.getSurface());
????????????try?{
????????????????mMediaPlayer.setDataSource(new?File(FileUtil.getDCIMCameraDir(),?"hlj_wallpaper").getAbsolutePath());
????????????????mMediaPlayer.setLooping(true);
????????????????mMediaPlayer.setVolume(0,?0);
????????????????mMediaPlayer.prepare();
????????????????mMediaPlayer.setOnPreparedListener(new?MediaPlayer.OnPreparedListener()?{
????????????????????@Override
????????????????????public?void?onPrepared(MediaPlayer?mp)?{
????????????????????????mMediaPlayer.start();
????????????????????}
????????????????});
????????????}?catch?(IOException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????????@Override
????????public?void?onSurfaceDestroyed(SurfaceHolder?holder)?{
????????????super.onSurfaceDestroyed(holder);
????????????mMediaPlayer.release();
????????????mMediaPlayer?=?null;
????????}
????????@Override
????????public?void?onVisibilityChanged(boolean?visible)?{
????????????if?(visible)?{
????????????????mMediaPlayer.start();
????????????}?else?{
????????????????mMediaPlayer.pause();
????????????}
????????}
????}
}
接著聲明這個(gè)服務(wù)同時(shí)聲明我們上面寫(xiě)的xml配置
?<serviceandroid:name=".VideoLiveWallpaper"android:label="@string/app_name"android:permission="android.permission.BIND_WALLPAPER"android:process=":wallpaper">????????????
????????????<intent-filter>
????????????????<action?android:name="android.service.wallpaper.WallpaperService"?/>
????????????intent-filter>
????????????
????????????<meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/wallpaper"?/>
????????service>
重點(diǎn)在onSurfaceCreated方法中,這里為了可以動(dòng)態(tài)切換不同的壁紙,我是指定去加載一個(gè)固定目錄下的視頻文件,然后不斷的復(fù)制新文件到這個(gè)目錄,因?yàn)橐坏╅_(kāi)啟切換壁紙這個(gè)方法就會(huì)調(diào)用,所以當(dāng)調(diào)用后再動(dòng)態(tài)通知去更改路徑不起作用。
所以我在更換壁紙前先清空
?try?{????????????????????????????????WallpaperManager.getInstance(getContext())
????????????????????????????????????????.clear();
????????????????????????????}?catch?(IOException?e)?{
????????????????????????????????e.printStackTrace();
????????????????????????????}
再去復(fù)制需要替換的壁紙到指定目錄
?copyFile(file.getAbsolutePath(),????????????????????????????????????new?File(FileUtil.getDCIMCameraDir(),
????????????????????????????????????????????"hlj_wallpaper").getAbsolutePath());
??/**
?????*?復(fù)制單個(gè)文件
?????*
?????*?@param?oldPath?String?原文件路徑?如:c:/fqf.txt
?????*?@param?newPath?String?復(fù)制后路徑?如:f:/fqf.txt
?????*?@return?boolean
?????*/
????public?void?copyFile(final?String?oldPath,?final?String?newPath)?{
????????progressBar.setVisibility(View.VISIBLE);
????????Observable.create(new?Observable.OnSubscribe()?{@Overridepublic?void?call(Subscriber?super?Boolean>?subscriber)?{try?{int?byteSum?=?0;int?byteRead?;
????????????????????File?oldFile?=?new?File(oldPath);if?(oldFile.exists())?{?//文件存在時(shí)
????????????????????????InputStream?inStream?=?new?FileInputStream(oldPath);?//讀入原文件
????????????????????????FileOutputStream?fs?=?new?FileOutputStream(newPath);byte[]?buffer?=?new?byte[1444];while?((byteRead?=?inStream.read(buffer))?!=?-1)?{
????????????????????????????byteSum?+=?byteRead;?//字節(jié)數(shù)?文件大小
????????????????????????????System.out.println(byteSum);
????????????????????????????fs.write(buffer,?0,?byteRead);
????????????????????????}
????????????????????????inStream.close();
????????????????????????subscriber.onNext(true);
????????????????????????subscriber.onCompleted();
????????????????????}
????????????????}?catch?(Exception?e)?{
????????????????????System.out.println("復(fù)制單個(gè)文件操作出錯(cuò)");
????????????????????e.printStackTrace();
????????????????????subscriber.onCompleted();
????????????????}
????????????}
????????})
????????????????.subscribeOn(Schedulers.io())
????????????????.observeOn(AndroidSchedulers.mainThread())
????????????????.subscribe(new?Observer()?{@Overridepublic?void?onCompleted()?{
????????????????????????progressBar.setVisibility(View.GONE);
????????????????????}@Overridepublic?void?onError(Throwable?e)?{
????????????????????????progressBar.setVisibility(View.GONE);
????????????????????}@Overridepublic?void?onNext(Boolean?aBoolean)?{
????????????????????????progressBar.setVisibility(View.GONE);
????????????????????????setToWallPaper(getContext());
????????????????????}
????????????????});
????}
setToWallPaper 方法就是真正的開(kāi)啟設(shè)置壁紙操作了
public?static?void?setToWallPaper(Context?context)?{????????final?Intent?intent?=?new?Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
????????intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
????????????????new?ComponentName(context,?VideoLiveWallpaper.class));
????????context.startActivity(intent);
????}
至此,一個(gè)簡(jiǎn)單的動(dòng)態(tài)壁紙就搞定了。
推薦閱讀
該用路由來(lái)管理你的界面跳轉(zhuǎn)了
Android:手把手教你如何優(yōu)雅的實(shí)現(xiàn)APP啟動(dòng)速度優(yōu)化
登不上高峰,看到的風(fēng)景始終有限
總結(jié)
以上是生活随笔為你收集整理的android byte[] 转string 好多问号_Android 仿抖音实现动态壁纸的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html 实现格子效果,div+css实
- 下一篇: linux 设置dns缓存周期,如何解决