本文已经收录到个人 Github 我的博客,欢迎大佬们光临寒舍:java
个人 Github 博客android
Git
与 Github
的基本使用Kotlin
语法基础Android
开发基础JitPack
仓库的一整套流程咱们在平常开发中,常常须要用到申请运行时权限的知识,因而,常常就写了下面的一大串代码nginx
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
//申请 CALL_PHONE 权限
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.CALL_PHONE
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1)
} else {
call()
}
}
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call()
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show()
}
}
}
}
复制代码
麻鸭,头疼,这么多代码,不只写着难受,看着更是头疼git
这时候,若是这个世界简单点,纯粹点,就行了github
XPermission.request(
this,
Manifest.permission.CALL_PHONE
) { allGranted, deniedList ->
if (allGranted) {
call()
} else {
Toast.makeText(this, "You denied $deniedList", Toast.LENGTH_SHORT).show()
}
}
复制代码
是否是感受世界又友好了不少呢?这段代码比以前的代码量少了不少不说,逻辑更是清晰了不少鸭!apache
很显然,上面用到了本身封装的框架,有可能你会一脸不屑:『这算啥?Github
上一堆权限申请框架,他们写的这个简洁又漂亮,功能又多又全,超帅的』segmentfault
我想说:『是的,你说的对,虽然 Github
上有这么多,跑得又快又棒的轮子,可是,别人作的菜总归没有本身的香鸭!咱们能够经过本身封装一个简单的权限申请框架开始,学习发布开源库到 Jitpack
/ Jcenter
的一整套流程,从而激发本身的学习兴趣,之后本身也多多造轮子(xia zhe teng)!成为 Android
界的轮子哥』数组
先为大佬送上笔者已经封装好的轮子:github.com/LoveLifeEve…bash
Android
项目新建一个空的 Android
项目网络
Github
项目
而后,把该项目
clone
到一个上面已经建立的Android
项目的位置将克隆下来的全部文件所有复制到上一层目录(注意:复制的时候不要忘记复制
.git
文件)将克隆的
XPermission
目录删除执行一系列的
git add .
git commit -m "First commit"
git push origin master
操做
XPermission
XPermission
,新建一个 module
,选择 Android Library
看到 library
就行,以下
而后,咱们思考下,运行时权限的实现思路,有如下三种:
BaseActivity
中Activity
来处理Fragment
来处理本文,将根据最后一个思路进行实现
InvisibleFragment
//给 (Boolean, List<String>) -> Unit 指定一个别名
typealias PermissionCallback = (Boolean, List<String>) -> Unit
class InvisibleFragment : Fragment() {
//定义一个 callback 做为运行时权限申请结果的回调通知方式
private var callback: PermissionCallback? = null
//定义申请权限的方法,vararg 表示可变长度的 permissions 参数列表
fun requestNow(cb: PermissionCallback, vararg permission: String) {
callback = cb
requestPermissions(permission, 1)
}
/** * 请求返回结果 * @param requestCode Int 请求码 * @param permissions Array<String> 权限 * @param grantResults IntArray 请求结果 */
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) {
if (requestCode == 1) {
// deniedList 用来记录被用户拒绝的权限
val deniedList = ArrayList<String>()
for ((index, result) in grantResults.withIndex()) {
if (result != PackageManager.PERMISSION_GRANTED) {
deniedList.add(permissions[index])
}
}
// allGranted 用来标识是否全部申请的权限都已经受权
val allGranted = deniedList.isEmpty()
//对申请权限的结果进行回调
callback?.let { it(allGranted, deniedList) }
}
}
}
复制代码
callback
做为运行时权限申请结果的回调通知方式requestNow
方法onRequestPermissionsResult
方法XPermission
object XPermission {
private const val TAG = "InvisibleFragment"
fun request( activity: FragmentActivity, vararg permission: String, callback: PermissionCallback ) {
val fragmentManager = activity.supportFragmentManager
val existedFragment = fragmentManager.findFragmentByTag(TAG)
val fragment = if (existedFragment != null) {
existedFragment as InvisibleFragment
} else {
val invisibleFragment = InvisibleFragment()
fragmentManager.beginTransaction().add(invisibleFragment, TAG).commitNow()
invisibleFragment
}
//这里在 permission 前面加个星号的意思是:将数组转化为可变长度参数传递过去
fragment.requestNow(callback, *permission)
}
}
复制代码
相信代码你们都看得懂,因此笔者就不写不少注释了(实际上是由于懒..)
在
app\build.gradle
中引入library
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//添加这行就行
implementation project(':library')
}
复制代码
而后进行你喜欢的权限申请
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
makeCallBtn.setOnClickListener {
XPermission.request(this, Manifest.permission.CALL_PHONE) { allGranted, deniedList ->
if (allGranted) {
call()
} else {
Toast.makeText(this, "You Denied $deniedList", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun call() {
val intent = Intent(Intent.ACTION_CALL)
intent.data = Uri.parse("tel:10086")
startActivity(intent)
}
}
复制代码
若是能够的话,恭喜你,你已经成功一大步了
JitPack
JitPack
简介JitPack 是一个网站,它容许你把 git
托管的 java
或 android
项目(貌似目前仅支持github
和码云),轻松发布到 jitpack
的 maven
仓库上,它全部内容都经过内容分发网络(CDN
)使用加密 https
链接获取
JitPack
优势:打包比较简单,省时间,背靠 Github
这座大山
缺点:每次导入库的时候,都要先在根的 build.gradle
文件中添加 maven
build.gradle
中添加 maven
插件buildscript {
ext.kotlin_version = '1.3.71'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
//添加 maven 插件
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
复制代码
library
目录的 build.gradle
下 apply
插件和添加 group
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//添加下面两行
apply plugin: 'com.github.dcendents.android-maven'
//这里 LoveLifeEveryday 改成你的 github 帐号名,个人是:LoveLifeEveryday
group='com.github.LoveLifeEveryday'
android {
...
}
复制代码
gradlew install
,从而构建你的 library
到你的本地 maven
仓库等待
BUILD SUCCESSFUL,
若BUILD FAIL
,说明构建失败,这时候你就要按照失败提示去排错,排错完后在执行一遍gradlew install
命令,直到出现BUILD SUCCESS
git
仓库
git add .
和git commit -m “XX”
git
仓库打 tag
git tag -a 1.0.0 -m "初版"
git push origin 1.0.0
复制代码
libary
的 github
界面,点击 release
,以下:Draft a new release
,新建一个 release
,以下:publich release
,以下:GitHub
帐号登录、注册 jitpack
library
的 github
项目地址,而后点击 Look Up
,以下:Get it
,它会滚到下面去,你要滚回上面去,先等一会,等 jitpack
那里构建完,会出现一个绿色的 log
,则构建成功,以下:而后你就能够愉快的在项目中按照它的提示引用你的开源库
jitpack
,把它的连接复制到你的 Readme
中去,以下:固然是在 app\build.gradle
中
//引用本身的开源库
implementation 'com.github.LoveLifeEveryday:XPermissions:1.0.0'
复制代码
而后尝试使用吧
一个优秀的开源项目,readme
必定不会差
鲁迅说:『虽然这些工做不会让你的项目变得牛逼,但会让你的项目变得漂亮,方便了其余人去了解你这个项目』
详细的美化操做,能够参考这篇文章:如何让你的 GitHub 项目表面上更专业
Call
权限申请无反应Call
权限至于我为何要使用逍遥模拟器,这又是另外一个故事了
Call
这个权限(such as 夜神模拟器),我以为原装的模拟器应该是能够正常运行的Jcenter
时 Failed
* What went wrong:
Execution failed for task ':utils:bintrayUpload'.
> org.apache.http.NoHttpResponseException: The target server failed to respond
复制代码
Google
&& Baidu
JitPack
若是想了解,怎么上传到
Jcenter
的话,能够看下这篇文章:AS上传Library到JCenter 教程+踩坑记录
若是文章对您有一点帮助的话,但愿您能点一下赞,您的点赞,是我前进的动力
本文参考连接: