我正在开发一个涉及多个开发人员的Android项目,其中一些开发人员在Windows上,另一些开发人员在Linux/MacOS上.由于我在Windows上,我已被指示配置Git如下以避免问题:
autocrlf = true
safecrlf = true
Run Code Online (Sandbox Code Playgroud)
这很好用.我在Android Studio中创建的任何.java/XML/etc文件都是CRLF,当我将它们推入repo时转换为LF,然后当我将更改提取到本地副本时返回CRLF.问题是,由于某种原因,某些类型的文件(如矢量可绘制资源)会在LF中生成.因此,当我尝试将它们添加到Git时,我得到了"不可逆转换"错误:
我知道我可以设置
safecrlf = warn
,但据我所知,如果Git错误地将它们用于文本文件,则存在破坏二进制文件的风险,因此我正在寻找更安全的解决方案.现在我在将它们添加到Git之前手动将矢量资源编辑到CRLF中,这避免了上述错误消息,但是为每个文件重复该过程变得乏味.有什么方法可以强制Android Studio在CRLF中生成所有本地文件?
我有一个生成视频文件的应用程序,它可以放在内部存储或 SD 卡中,需要通过 Intent.ACTION_VIEW 由用户首选的视频播放器应用程序打开。该应用程序在面向 API 22 时按预期工作,但是当我尝试将其升级到 27 时遇到了问题。
该应用程序根据存储位置生成不同类型的 URI。对于内部存储,它使用文件 URI,如下所示:
file:///storage/emulated/0/VideoRecorder/2018_06_22_12_25_50.mp4
Run Code Online (Sandbox Code Playgroud)
对于放置在 SD 卡中的视频,它使用内容 URI:
content://com.android.externalstorage.documents/tree/72D1-C625%3Avideostest%2Ftest2/document/72D1-C625%3Avideostest%2Ftest2%2F2018_06_22_12_41_27.mp4
Run Code Online (Sandbox Code Playgroud)
Nougat 不喜欢 file:// URI,所以我使用 FileProvider(下面的代码)来解决这个问题,将文件 URI 转换为其他应用程序可以使用 ACTION_VIEW 打开的内容 URI。我认为 SD 卡 URI 不需要任何更改,因为它已经是内容 URI,但似乎只有默认照片应用程序可以使用 ACTION_VIEW 意图打开该 URI,而用户安装的应用程序(如 VLC Player)则不能,失败,但出现以下异常:
java.lang.SecurityException: Permission Denial: reading com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/tree/72D1-C625:videostest/test2/document/72D1-C625:videostest/test2/2018_06_22_12_27_45.mp4 from pid=7809, uid=10022 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)
检查了 FileProvider 生成的 URI 后,我想我明白了这个问题。它生成的内容 URI 的格式与我用于 SD 卡视频的内容 URI 的格式完全不同:
content://io.github.androidtests.videorecorder.videosfileprovider/external_files/VideoRecorder/2018_06_22_12_25_50.mp4
Run Code Online (Sandbox Code Playgroud)
我的问题是,SD 卡视频是否也需要通过 FileProvider 共享?我该怎么做,因为我只有内容 URI,没有文件,而且 FileProvider 似乎专门设计用于将文件转换为 URI?
编辑:在测试了更多视频播放器应用程序之后,其中一些似乎能够使用内容 URI,就像照片应用程序一样。这只是一些应用程序不支持内容 URI 的情况吗?
代码:
Uri uri …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序需要临时访问设备的 SMS。在 KitKat 及更高版本中,此访问权限仅授予默认 SMS 应用程序,因此我使用:
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这会弹出一个对话框,询问用户是否让我的应用程序成为默认的 SMS 应用程序。到现在为止还挺好。问题是,一旦我的应用程序完成其操作,我必须再次询问用户,他们是否要将以前的应用程序恢复为默认的 SMS 应用程序。
我想要一种避免第二个对话框的方法,也许是让我的应用程序告诉 Android 操作系统它不再希望成为默认的 SMS 应用程序,以便以前的应用程序可以再次自动接管。我知道 Android 支持这一点,因为如果我在我的应用程序是默认 SMS 应用程序的情况下卸载它,Android 将自动恢复到之前的应用程序,无需用户输入。有什么方法可以在不卸载的情况下复制这种放弃控制的行为?