Hello,大家吼,週一你快樂嗎<( ̄︶ ̄)?郭小司機又來開拖拉機啦,作為了一個非專業的分享猿,我知道也沒有人會想我的 ̄へ ̄,如今工作又忙碌起來,在產品經理各種(nue)呵(dai)護,老闆對需求的各種細(da)調(gai)下,只能在閒(tou)暇(lan)的時候才能碼碼水貨,以表慰♂藉。
這次我們繼續聊聊專案中遇到的問題吧,作為上輩子的天使,才換來今生的入坑Android,碼農不易,我們的夢想就是,下輩子下班時,不再月上柳梢頭,可以看到夕陽下的奔跑,那是我們逝去的青春〒〒。
1、依賴包衝突
你是否也曾遇到過,興致勃勃的匯入專案依賴,卻突然提醒你v23xxxxx,這時候你除了( ‵o′)凸,或者還可以試試下面這個,相信真愛一定可以成功編譯!當然,如果依賴庫還應用了高版本的特性,那麼···還是升級你的支援包吧(。・・)ノ!
compile('com.xxxx.xxxx:1.1.0') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}複製程式碼
2、隱藏虛擬按鍵
(亂入1)有時候,我們需要在全屏顯示的時候,隱藏虛擬按鍵,但是藏好後,一碰螢幕它們又歡快的蹦躂出來,這時候除了問候,你還可以試試下面度娘說的,也許你就再也看不到它們了。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
((Activity) context).getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);//API19
} else {
((Activity) context).getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
);
}複製程式碼
3、Dialog的Gravity
(亂入2)這是個小問題,只是那時候讓本人調了好幾遍,那就是Dialog的gravity是Center的,如果你想讓它出現在上面,不要忘了它:
WindowManager.LayoutParams localLayoutParams = mDialog.getWindow().getAttributes();
localLayoutParams.gravity = Gravity.TOP;複製程式碼
4、NDK的so支援
產品吐槽你的包太大了?so太多?新依賴的包沒有對應的so?這時候或者你可以選擇配置,要支援的動態連結庫。
一般其實'armeabi'和'armeabi-v7a'就足夠了,因為如今大部分X86的機器也支援,不過會跑不了win的X86虛擬機器。(反正我不跑虛擬機器好多年╮(╯_╰)╭)。其實你還可以選擇在app跑起來的時候,對應下載支援的so實現熱插拔,因為某種程度上,使用對應的so會讓APP跑得比較快,可惜我lan(。・・)ノ。
android {
···
defaultConfig {
···
ndk {
//APP的build.gradle設定支援的SO庫架構
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
}
}複製程式碼
5、建立你的依賴管理
有時候你需要在你的各個lib module中,配置各種依賴版本、編譯版本、最大最小版本支援,這時候各種版本的升級、管理會顯示格外重複,或者你可以選擇一個檔案,來實現方(tou)便(lan)管理與維護。
- 首先定義一個依賴管理gradle:dependence.gradle,將庫和版本都存放其中。
- 在專案根gradle中匯入:
apply from: 'dependencies.gradle'
。 - 在其他專案中統一引用,這樣各個專案中的版本也能夠統一管理啦。
dependence.gradle
ext {
androidBuildToolsVersion = "23.0.2"
androidMinSdkVersion = 16
androidTargetSdkVersion = 23
androidCompileSdkVersion = 23
supportLibraryVersion = '23.0.2'
version = '1.5'
android = [
recyclerView: "com.android.support:recyclerview-v7:${supportLibraryVersion}",
appcompat_v7: "com.android.support:appcompat-v7:${supportLibraryVersion}",
support_v4 : "com.android.support:support-v4:${supportLibraryVersion}",
]
view = [
aaaaaa: "com.xxxxxx:aaaaaa:${version}",
]
}複製程式碼
app/lib 的build.gradle
android {
def globalConfiguration = rootProject.extensions.getByName("ext")
compileSdkVersion globalConfiguration.androidCompileSdkVersion
buildToolsVersion globalConfiguration.androidBuildToolsVersion
defaultConfig {
applicationId "com.xxx.xxxx"
minSdkVersion globalConfiguration.androidMinSdkVersion
targetSdkVersion globalConfiguration.androidTargetSdkVersion
versionCode 1
versionName "1.0.0"
ndk {
//設定支援的SO庫架構
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
def view = rootProject.ext.view
def android = rootProject.ext.android
compile android.appcompat_v7
compile view.aaaaaa
}複製程式碼
6、配置你的線上和線下版本
實際開發中,我們可以經常需要,線上上和線下版本切換,這時候不同環境中的appid、簽名、URL都需要對應有不同的配置,還有AndroidManifest下的各種meta···(ノಠ益ಠ)ノ彡┻━┻,冷靜冷靜,因為這時候可愛又迷人的Gradle,又可以讓你高潮(ˉ ̄~) 。
//配置不同的簽名
signingConfigs {
debug {
//密匙的路徑
storeFile file("../debug.jks")
storePassword "123456"
keyAlias "debug"
keyPassword "123456"
}
release {
//密匙的路徑
storeFile file("../release.jks")
storePassword "123456"
keyAlias "release"
keyPassword "123456"
}
}
//不同編譯下對應的不同配置
buildTypes {
debug {
//混淆
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//對應簽名
signingConfig signingConfigs.debug
//URL
buildConfigField "String", "URL_HOST",
"\"https://XXXX.XXXX.XXXX/""
buildConfigField "String", "QQ_APPID", "\"11111111111\""
buildConfigField "String", "QQ_APPSECRET", "\"XXXXXXXXXXXXXXXX\""
buildConfigField "Boolean", "DEBUG_TAG", "true"
//對應修改AndroidManifest的各種KEY_
manifestPlaceholders = [BAIDU_KEY_VAULE : "fffffffffffffffffffff",
UMENG_CHANNEL_VALUE : "xxxxxxxxx"]
}
release {
//混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//對應簽名
signingConfig signingConfigs.release
//URL
buildConfigField "String", "URL_HOST",
"\"https://XXXX.XXXX.XXXX/""
buildConfigField "String", "QQ_APPID", "\"11111111111\""
buildConfigField "String", "QQ_APPSECRET", "\"XXXXXXXXXXXXXXXX\""
buildConfigField "Boolean", "DEBUG_TAG", "false"
//對應修改AndroidManifest的各種KEY_
manifestPlaceholders = [BAIDU_KEY_VAULE : "fffffffffffffffffffff",
UMENG_CHANNEL_VALUE : "xxxxxxxxx"]
}
}複製程式碼
7、視訊出現有聲音但是沒畫面
(亂入3)額,話風突變啊,因為這是最後一條啦╮(╯_╰)╭。最後扯扯蛋收尾吧。
如果使用IJKPlayer遇到這種問題,首先檢視下你的視訊編碼方式是不是H264,還有pixel format屬性,如果這個屬性是N/A,那麼一般都是錄製的視訊和FFMPEG的相容問題,你可以選擇更換視訊的錄製配置;或者更換播放器,使用原生的mediaPlayer、乾兒子EXOPlayer,一般它們也是支援的。如果它們也不支援,那麼還要這視訊幹啥?
好了,水完了。
最後這是我的Github,來逛逛嗎( ﹁ ﹁ ) ~→ github.com/CarGuo 。