Skip to content

Commit 523d780

Browse files
committed
➖ 🔥
[Update] - 移除第三方库 RxPermission,使用原始的权限申请方式
1 parent 45d66fb commit 523d780

File tree

4 files changed

+105
-47
lines changed

4 files changed

+105
-47
lines changed

filepicker/build.gradle

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ android {
1212
compileSdkVersion 28
1313

1414
defaultConfig {
15-
minSdkVersion 22
15+
minSdkVersion 16
1616
targetSdkVersion 28
1717
versionCode 1
1818
versionName "1.0"
@@ -27,17 +27,17 @@ android {
2727
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2828
}
2929
}
30-
3130
}
3231

32+
ext.supportLibVersion = '28.0.0'
33+
3334
dependencies {
3435
implementation fileTree(dir: 'libs', include: ['*.jar'])
35-
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
36-
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.42'
36+
implementation "com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.42"
3737
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
38-
implementation 'com.android.support:appcompat-v7:28.0.0'
39-
implementation 'com.android.support:recyclerview-v7:28.0.0'
40-
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
38+
implementation "com.android.support:appcompat-v7:${supportLibVersion}"
39+
implementation "com.android.support:recyclerview-v7:${supportLibVersion}"
40+
implementation "com.android.support.constraint:constraint-layout:1.1.3"
4141
testImplementation 'junit:junit:4.12'
4242
androidTestImplementation 'com.android.support.test:runner:1.0.2'
4343
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

filepicker/src/main/java/me/rosuh/filepicker/FilePickerActivity.kt

Lines changed: 79 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import android.Manifest
44
import android.app.Activity
55
import android.content.ActivityNotFoundException
66
import android.content.Intent
7+
import android.content.pm.PackageManager
78
import android.net.Uri
89
import android.support.v7.app.AppCompatActivity
910
import android.os.Bundle
1011
import android.os.Environment
1112
import android.os.Environment.MEDIA_MOUNTED
13+
import android.support.v4.app.ActivityCompat
14+
import android.support.v4.content.ContextCompat
1215
import android.support.v7.widget.AppCompatButton
1316
import android.support.v7.widget.AppCompatImageButton
1417
import android.support.v7.widget.LinearLayoutManager
@@ -19,7 +22,6 @@ import android.widget.CheckBox
1922
import android.widget.Toast
2023
import com.chad.library.adapter.base.BaseQuickAdapter
2124
import com.chad.library.adapter.base.BaseViewHolder
22-
import com.tbruyelle.rxpermissions2.RxPermissions
2325
import me.rosuh.filepicker.bean.FileTypeEnum.COMPRESSED
2426
import me.rosuh.filepicker.bean.FileTypeEnum.DIR
2527
import me.rosuh.filepicker.bean.FileTypeEnum.IMAGE
@@ -43,68 +45,105 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
4345
/**
4446
* 文件列表
4547
*/
46-
var mRvList: RecyclerView? = null
48+
private var mRvList: RecyclerView? = null
4749
/**
4850
* 导航栏列表
4951
*/
50-
var mNavList: RecyclerView? = null
52+
private var mNavList: RecyclerView? = null
5153
/**
5254
* 文件列表适配器
5355
*/
54-
var mListAdapter: BaseQuickAdapter<FileItemBean, BaseViewHolder>? = null
56+
private var mListAdapter: BaseQuickAdapter<FileItemBean, BaseViewHolder>? = null
5557
/**
5658
* 导航栏列表适配器
5759
*/
58-
var mNavAdapter: BaseQuickAdapter<FileNavBean, BaseViewHolder>? = null
60+
private var mNavAdapter: BaseQuickAdapter<FileNavBean, BaseViewHolder>? = null
5961
/**
6062
* 导航栏数据集
6163
*/
62-
var mNavDataSource = ArrayList<FileNavBean>()
64+
private var mNavDataSource = ArrayList<FileNavBean>()
6365
/**
6466
* 文件夹为空时展示的空视图
6567
*/
66-
var mEmptyView: View? = null
68+
private var mEmptyView: View? = null
6769

68-
var mBtnSelectedAll: AppCompatButton? = null
69-
var mBtnConfirm: AppCompatButton? = null
70-
var mBtnGoBack: AppCompatImageButton? = null
71-
val mFilesIsChecked: AtomicBoolean? = AtomicBoolean(false)
70+
private var mBtnSelectedAll: AppCompatButton? = null
71+
private var mBtnConfirm: AppCompatButton? = null
72+
private var mBtnGoBack: AppCompatImageButton? = null
73+
private val mFilesIsChecked: AtomicBoolean? = AtomicBoolean(false)
74+
75+
private val FILE_PICKER_PERMISSION_REQUEST_CODE = 10201
7276

7377
override fun onCreate(savedInstanceState: Bundle?) {
7478
setTheme(FilePickerManager.themeId)
79+
7580
super.onCreate(savedInstanceState)
7681
setContentView(R.layout.activity_file_picker)
7782
// 获取权限
78-
val rxPermissions = RxPermissions(this)
79-
val dispose = rxPermissions
80-
.request(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
81-
.subscribe {
82-
if (!it) {
83-
Toast.makeText(this@FilePickerActivity, "未授予存储权限", Toast.LENGTH_SHORT).show()
84-
finish()
85-
} else {
86-
Toast.makeText(this@FilePickerActivity, "已授予存储权限", Toast.LENGTH_SHORT).show()
87-
if (Environment.getExternalStorageState() != MEDIA_MOUNTED) {
88-
throw Throwable(IllegalStateException("外部存储不可用"))
89-
}
83+
if (setupPermission()) {
84+
prepareLauncher()
85+
}
86+
}
9087

91-
// 根目录文件对象
92-
val rootFile = File(Environment.getExternalStorageDirectory().absoluteFile.toURI())
88+
private fun setupPermission(): Boolean {
89+
val permissionStatus = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
90+
if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
91+
requestPermission()
92+
return false
93+
}
94+
return true
95+
}
9396

94-
// 文件列表数据集
95-
val listData = FileUtils.produceListDataSource(rootFile)
96-
mNavDataSource =
97-
FileUtils.produceNavDataSource(
98-
mNavDataSource,
99-
Environment.getExternalStorageDirectory().absolutePath
100-
)
97+
/**
98+
* 申请权限
99+
*/
100+
private fun requestPermission() {
101+
ActivityCompat.requestPermissions(
102+
this@FilePickerActivity,
103+
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
104+
FILE_PICKER_PERMISSION_REQUEST_CODE
105+
)
106+
}
101107

102-
initView(listData, mNavDataSource)
108+
override fun onRequestPermissionsResult(
109+
requestCode: Int,
110+
permissions: Array<out String>,
111+
grantResults: IntArray
112+
) {
113+
when (requestCode) {
114+
FILE_PICKER_PERMISSION_REQUEST_CODE -> {
115+
if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
116+
Toast.makeText(this@FilePickerActivity, "未授予存储权限", Toast.LENGTH_SHORT).show()
117+
} else {
118+
prepareLauncher()
103119
}
104120
}
121+
}
122+
}
123+
124+
/**
125+
* 在做完权限申请之后开始的真正的工作
126+
*/
127+
private fun prepareLauncher() {
128+
if (Environment.getExternalStorageState() != MEDIA_MOUNTED) {
129+
throw Throwable(IllegalStateException("外部存储不可用"))
130+
}
131+
132+
// 根目录文件对象
133+
val rootFile = FileUtils.getRootFile()
134+
135+
// 文件列表数据集
136+
val listData = FileUtils.produceListDataSource(rootFile)
137+
mNavDataSource =
138+
FileUtils.produceNavDataSource(
139+
mNavDataSource,
140+
Environment.getExternalStorageDirectory().absolutePath
141+
)
142+
143+
initView(listData, mNavDataSource)
105144
}
106145

107-
fun initView(fileListData: ArrayList<FileItemBean>, fileNavData: ArrayList<FileNavBean>) {
146+
private fun initView(fileListData: ArrayList<FileItemBean>, fileNavData: ArrayList<FileNavBean>) {
108147
mRvList = findViewById(R.id.rv_list_file_picker)
109148
mNavList = findViewById(R.id.rv_nav_file_picker)
110149
mBtnSelectedAll = findViewById(R.id.btn_selected_all_file_picker)
@@ -115,7 +154,8 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
115154
mBtnConfirm!!.setOnClickListener(this)
116155

117156
// 空视图
118-
mEmptyView = layoutInflater.inflate(R.layout.item_empty_view_file_picker, mRvList!!.parent as ViewGroup, false)
157+
mEmptyView =
158+
layoutInflater.inflate(R.layout.item_empty_view_file_picker, mRvList!!.parent as ViewGroup, false)
119159
// 列表适配器
120160
mListAdapter = produceListAdapter(fileListData)
121161
// 导航栏适配器
@@ -188,7 +228,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
188228
}
189229
COMPRESSED -> {
190230
val sub = item.mFileName.substring(item.mFileName.lastIndexOf("."))
191-
intent.type = "application/" + sub
231+
intent.type = "application/$sub"
192232
intent.data = Uri.parse(item.filePath)
193233
startActivity(intent)
194234
}
@@ -209,11 +249,11 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
209249
* 从列表中时,需要获取目标文件夹在 nav 列表中的位置,如果没有则传入 -1
210250
* TODO 进入下一个文件夹之前,需要先清空当前的选中状态?貌似不需要
211251
*/
212-
fun enterDirAndUpdateUI(iFileBean: IFileBean) {
252+
private fun enterDirAndUpdateUI(iFileBean: IFileBean) {
213253
var pos = -1
214254

215255
for (data in mNavAdapter!!.data) {
216-
if (data.dirPath.equals(iFileBean.filePath)) {
256+
if (data.dirPath == iFileBean.filePath) {
217257
pos = mNavAdapter!!.data.indexOf(data)
218258
}
219259
}
@@ -224,7 +264,7 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
224264
/**
225265
* 从导航栏中调用本方法,需要传入 pos,以便生产新的 nav adapter
226266
*/
227-
fun enterDirAndUpdateUI(iFileBean: IFileBean, position: Int) {
267+
private fun enterDirAndUpdateUI(iFileBean: IFileBean, position: Int) {
228268
// 获取文件夹文件
229269
val nextFiles = File(iFileBean.filePath)
230270
// 获取列表的数据集
@@ -262,7 +302,6 @@ class FilePickerActivity : AppCompatActivity(), BaseQuickAdapter.OnItemClickList
262302

263303
override fun onBackPressed() {
264304
super.onBackPressed()
265-
266305
}
267306

268307
override fun onClick(v: View?) {

filepicker/src/main/java/me/rosuh/filepicker/config/FilePickerManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,7 @@ object FilePickerManager {
3838

3939
var selfFilter: FileFilter?= null
4040

41+
var isUseSelfTheme:Boolean = false
42+
4143
var themeId:Int = R.style.FilePickerThemeRail
4244
}

filepicker/src/main/java/me/rosuh/filepicker/utils/FileUtils.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package me.rosuh.filepicker.utils
22

3+
import android.os.Environment
34
import me.rosuh.filepicker.bean.FileItemBean
45
import me.rosuh.filepicker.bean.FileNavBean
56
import me.rosuh.filepicker.bean.FileTypeEnum
67
import me.rosuh.filepicker.bean.FileTypeEnum.DIR
78
import me.rosuh.filepicker.config.FilePickerManager
9+
import me.rosuh.filepicker.config.StorageMediaTypeEnum.EXTERNAL_STORAGE
810
import java.io.File
911

1012
/**
@@ -15,6 +17,21 @@ import java.io.File
1517
class FileUtils {
1618

1719
companion object {
20+
/**
21+
* 根据配置参数获取根目录文件
22+
* @return File
23+
*/
24+
fun getRootFile():File{
25+
when(FilePickerManager.mediaStorageType){
26+
EXTERNAL_STORAGE -> {
27+
return File(Environment.getExternalStorageDirectory().absoluteFile.toURI())
28+
}
29+
else -> {
30+
return File(Environment.getExternalStorageDirectory().absoluteFile.toURI())
31+
}
32+
}
33+
}
34+
1835
/**
1936
* 根据传入的文件名返回文件类型
2037
* 判断的方式是根据文件的后缀名

0 commit comments

Comments
 (0)