Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加“黑名单”时提示“应用需要必要的运行权限” #202

Open
qjzcj2008 opened this issue Jul 10, 2023 · 11 comments
Open

Comments

@qjzcj2008
Copy link
Contributor

APlayer版本:v1.6.1.0(16102) (google)
Android系统版本:Android 13 三星国行 One UI 5.1
在过往版本中可以成功添加黑名单目录,现版本想要添加黑名单时发现点击“添加”按钮后提示错误,错误提示为“应用需要必要的运行权限”,系统设置中已允许全部申请的权限,播放功能是正常的。
Screenshot_20230710_143747_APlayer
Screenshot_20230710_143800_Permission controller
试了一下,手动扫描点击后也会有相同的报错,但在使用歌单导入/导出功能时可以正常调起SAF。

@qjzcj2008
Copy link
Contributor Author

尝试了一下,回退到1.5.9.1版本后可以正常打开黑名单添加页面。

初步问题定位到了Android 13权限变更后,黑名单手动搜索功能还并未适配SAF

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />

1.6之后的版本细化了权限请求,在Android 13上不再请求储存权限。但黑名单的添加和手动搜索仍依赖于过往的FolderChooser类来实现,这就导致了1.6之后的版本在Android 13及以上版本添加黑名单和进行手动搜索时,即使授予全部权限仍会报错“应用需要必要的运行权限”。

FolderChooser(
this,
TAG_BLACKLIST,
null,
null,
null,
object : FolderChooser.FolderCallback {
override fun onFolderSelection(chooser: FolderChooser, folder: File) {
if (folder.isDirectory) {
val newBlacklist = LinkedHashSet<String>(blackList)
newBlacklist.add(folder.absolutePath)
SPUtil.putStringSet(
this@SettingActivity,
SETTING_KEY.NAME,
SETTING_KEY.BLACKLIST,
newBlacklist
)
contentResolver.notifyChange(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null
)
}
configBlackList()
}
}).show()
}
}
}

不过这个我不太会修(;′⌒`)尝试了一天面向GPT编程之后,感觉可能还是得等其他人来修了😥

顺带一提Q音的搜索接口好像也挂了,酷狗现在似乎也不再lrc格式中附带翻译了,这部分的讨论要新建个issue来讨论,还是用以前那个网易云接口的issue修改一下集中讨论呢?

@rRemix
Copy link
Owner

rRemix commented Jul 14, 2023

因为最近工作太忙,权限的问题等后面空一点再修复,当然更欢迎pr
接口的话不建议花太多时间了,估计后面都慢慢不能用了

@qjzcj2008
Copy link
Contributor Author

权限适配这边我之前试了下,不过还是对这块不太熟,试了下没修好,估计到时候还是得你们来。😥

接口的话不建议花太多时间了,估计后面都慢慢不能用了

这倒确实,不过歌词功能也是我一开始来使用的一大痛点😥所以还是借这个issue说一下大体的情况吧,看看后面怎么处理

  1. Q音的搜索接口感觉动得比较频繁,而且大多数都要求登录,可能这部分没什么比较好的办法了。
  2. 酷狗现在似乎仅在其专有的krc格式中附带翻译了,格式的转换倒是在其他地方看到过已经有逆向成果了,跑了一下也能跑通,不过他们的内容格式也不是标准的双语lrc格式,他们用了一个叫[language:]的行携带了一个base64过后的json,json的内容包含不包含时间戳的歌词注音和(或)翻译,其按照行数和剩余部分的lrc歌词对应。这部分的处理我也不太会写😥

@Radium-bit
Copy link

希望能够尽快修复黑名单和文件选择器的问题

@qjzcj2008
Copy link
Contributor Author

qjzcj2008 commented Aug 1, 2023

我尝试修复了一下黑名单的SAF适配,不过因为对Android开发确实不太熟悉,现在的问题是我不知道要如何从uri获取文件夹的绝对路径,但我已经不知道该怎么改了🤔你可以看看,如果需要的话,我可以提pr,然后一起来修从uri取文件夹路径的问题。 @rRemix
master...qjzcj2008:APlayer:SAF-Fix

目前的问题在于我不知道该如何从uri取得文件夹的绝对地址。
  这是我目前使用的从uri获取文件夹路径的方法
https://github.com/qjzcj2008/APlayer/blob/331678d4d143636208446698aea282c73d181652/app/src/main/java/remix/myplayer/ui/activity/SettingActivity.kt#L133-L148
  但不知道为什么这个方法无法获取到上级文件夹,仅能够获得当前文件夹的名称,并不能获取到文件夹的完整相对路径,使得我的这个修复版本仅能在添加一级目录时有效,并且挂载点信息似乎无法取得。
  获取到的uri的content提供者都是content://com.android.externalstorage.documents/似乎无法区分文件是否来自外部储存(不过我这边的设备都不支持SD卡了,所以也没有进行测试),这部分我目前是用Environment.getExternalStorageDirectory()去和文件夹的相对路径进行拼接的(其实感觉和写死/storage/emulated/0/已经没啥差别了🤔)
  获取到的uri中倒是包含文件夹的完整相对路径,但似乎对一些文件夹其uri也是特殊的,如果要从uri取的话感觉要做好几种状况的应对。
content://com.android.externalstorage.documents/tree/primary:Lv1/Lv2/document/primary:Lv1/Lv2/
content://com.android.externalstorage.documents/tree/home:Lv1/document/home:Lv1
  分别对应/Lv1/Lv2/Document/Lv1这两个路径,似乎对于document文件夹及其子文件夹的uri是特殊的(目前仅发现这个特例)
  不知道这部分有没有什么更好的处理方法。

说起来,顺便翻了一下,似乎对接口返回歌词的处理是放在src/main/java/remix/myplayer/lyric/LyricSearcher.kt里的?之前研究了一下,Q音的接口要修可能比较难了,大部分接口都要求登录才可以使用,但酷狗那边的翻译感觉还有修一修的希望,要不看看后面有空我开个issue大家讨论一下看看能不能修一修?

@Henry-ZHR
Copy link
Contributor

我尝试修复了一下黑名单的SAF适配,不过因为对Android开发确实不太熟悉,现在的问题是我不知道要如何从uri获取文件夹的绝对路径,但我已经不知道该怎么改了thinking你可以看看,如果需要的话,我可以提pr,然后一起来修从uri取文件夹路径的问题。 @rRemix master...qjzcj2008:APlayer:SAF-Fix

目前的问题在于我不知道该如何从uri取得文件夹的绝对地址。   这是我目前使用的从uri获取文件夹路径的方法 https://github.com/qjzcj2008/APlayer/blob/331678d4d143636208446698aea282c73d181652/app/src/main/java/remix/myplayer/ui/activity/SettingActivity.kt#L133-L148   但不知道为什么这个方法无法获取到上级文件夹,仅能够获得当前文件夹的名称,并不能获取到文件夹的完整相对路径,使得我的这个修复版本仅能在添加一级目录时有效,并且挂载点信息似乎无法取得。   获取到的uri的content提供者都是content://com.android.externalstorage.documents/似乎无法区分文件是否来自外部储存(不过我这边的设备都不支持SD卡了,所以也没有进行测试),这部分我目前是用Environment.getExternalStorageDirectory()去和文件夹的相对路径进行拼接的(其实感觉和写死/storage/emulated/0/已经没啥差别了thinking)   获取到的uri中倒是包含文件夹的完整相对路径,但似乎对一些文件夹其uri也是特殊的,如果要从uri取的话感觉要做好几种状况的应对。   content://com.android.externalstorage.documents/tree/primary:Lv1/Lv2/document/primary:Lv1/Lv2/content://com.android.externalstorage.documents/tree/home:Lv1/document/home:Lv1   分别对应/Lv1/Lv2/Document/Lv1这两个路径,似乎对于document文件夹及其子文件夹的uri是特殊的(目前仅发现这个特例)   不知道这部分有没有什么更好的处理方法。

说起来,顺便翻了一下,似乎对接口返回歌词的处理是放在src/main/java/remix/myplayer/lyric/LyricSearcher.kt里的?之前研究了一下,Q音的接口要修可能比较难了,大部分接口都要求登录才可以使用,但酷狗那边的翻译感觉还有修一修的希望,要不看看后面有空我开个issue大家讨论一下看看能不能修一修?

Google 的设计好像就是不想让人拿绝对路径……

看看歌曲文件的 Uri 能不能直接拿来匹配?

或者也可以直接用 https://developer.android.com/reference/android/provider/MediaStore.MediaColumns#RELATIVE_PATH,手动输入路径或者用获取到的所有路径糊一个和原来一样的 UI?

@qjzcj2008
Copy link
Contributor Author

看看歌曲文件的 Uri 能不能直接拿来匹配?

那要改的地方太多了🤔其他地方能跑还是最好不去动比较好🤔

用最粗暴的办法手搓了一个从uri拼接完整地址的办法🤔我这边试了一下倒是没问题,为了保险起见我只写了现在见到的两种形式的uri的转化,其他类型的uri遇到了直接抛null取消后面的流程🤔

我提pr了

@rRemix
Copy link
Owner

rRemix commented Aug 4, 2023

权限适配这边我之前试了下,不过还是对这块不太熟,试了下没修好,估计到时候还是得你们来。😥

接口的话不建议花太多时间了,估计后面都慢慢不能用了

这倒确实,不过歌词功能也是我一开始来使用的一大痛点😥所以还是借这个issue说一下大体的情况吧,看看后面怎么处理

  1. Q音的搜索接口感觉动得比较频繁,而且大多数都要求登录,可能这部分没什么比较好的办法了。
  2. 酷狗现在似乎仅在其专有的krc格式中附带翻译了,格式的转换倒是在其他地方看到过已经有逆向成果了,跑了一下也能跑通,不过他们的内容格式也不是标准的双语lrc格式,他们用了一个叫[language:]的行携带了一个base64过后的json,json的内容包含不包含时间戳的歌词注音和(或)翻译,其按照行数和剩余部分的lrc歌词对应。这部分的处理我也不太会写😥

如果能找到接口的话可以提供给我,我来做后续的适配 @qjzcj2008

@qjzcj2008
Copy link
Contributor Author

酷狗歌词的接口还好,只要改一个参数就好,主要是后续的处理,文件解密和翻译合成。

fun searchKuGouLyric(id: Int, accessKey: String?): Single<KLrcResponse> {
return kuGouApi.searchKuGouLyric(1, "pc", "lrc", "utf8", id, accessKey)
}

接口把这里参数的lrc改成krc就好
krc文件的解密算法在这里有别人的逆向结果和可用样例代码。

返回的数据结构和原来的一致,只是content的值变为了base64后的krc文件,krc解密后的文件样例如下

[id:$00000000]
[ar:*]      
[ti:*]   
[by:]
[language:一个base64后的json]
[00:00.000]***
[00:07.200]***
[00:14.400]***

对language行的base64解码后得到的文件样例如下

{
  "content": [
    {
      "language": 0,
      "lyricContent": [
        ["***"],
        ["***"],
        ["***"]
        ],
      "type": 1
    },
    {
      "language": 0,
      "lyricContent": [注音(可能会根据语言不同?)],
      "type": 0
    }
  ],
  "version": 1
}

language似乎并没有意义,语言区分依靠type,目前观察下来type为1时为中文翻译,lyricContent中的翻译(不带时间戳)与krc解密后[language:]行以下的行一一对应。

之前测的时候发现好像带个什么参数会更容易命中带翻译的krc,不过当时没记下来,现在测试的时候好像也没遇到不带翻译的krc了😂不过感觉kg现在这搜索接口有点怪怪的,有些就搜不出来,去网页版试了一下同样的关键词是有结果的,不知道什么情况,再观察看看吧。

q音那边似乎是老接口基本上全下线了,看了一下现在的接口基本上要么得登录,要么要sign,再说吧。@rRemix
实在不行要不先加个选项弹个输入框让用户自己填mid先凑合凑合🤣以后可以考虑变成让用户填网页地址,自动从里面提mid🤣

@AQUOSZZY
Copy link

使用的是release版本APlayer_v1.6.1.0_nongoogle_2023-04-27.16-05.apk,系统版本Android13 MIUI 14.0.7,遇到了同样的问题,无法手动扫描。
并且无法自动扫描出SD卡中的音乐文件,导入设备可以正常读取,回退到多个旧版本尝试也没用(1.5.9.1手动扫描崩溃),希望能够尽快修复。

@YaeSakuraQvQ
Copy link

非常好软件,爱来自瓷器 可惜bug还没修(
插个眼,大佬有空时修下吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants