Я пишу приложение для запуска JavaScript файлов и пытаюсь добавить возможность прикрепить ярлык к файлу сценария на панели запуска.
Приложение в настоящее время работает, открывая .js
файлы (по схеме content://
) из пользовательского диалогового окна приложения, а также из файлового браузера устройства; однако после закрепления ярлыка на файле и щелчка по нему появляется значок с надписью «Приложение не установлено».
Соответствующий код выглядит следующим образом:
AndroidManifest. xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INSTALL_SHORTCUT"/>
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.js"/>
<data android:host="*"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.js"/>
<data android:host="*"/>
</intent-filter>
</activity>
</application>
MainActivity.kt
...
@RequiresApi(Build.VERSION_CODES.O)
private fun createScriptShortcut() {
val shortcutManager: ShortcutManager? = getSystemService(ShortcutManager::class.java)
if (shortcutManager!!.isRequestPinShortcutSupported) {
if (engine.currentFileUri == null) {
return
}
val uri: Uri = engine.currentFileUri as Uri
val intent = Intent(
Intent.ACTION_MAIN,
uri,
this,
MainActivity::class.java
)
intent.type = "*/*"
intent.data = uri
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
intent.`package` = "io.github.ascenderx.mobilescript"
// TODO: Create fragment to let user customize shortcut label.
val pinShortcutInfo: ShortcutInfo = ShortcutInfo.Builder(this, "scriptShortcut")
.setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_foreground))
.setShortLabel(uri.toString())
.setIntent(intent)
.build()
shortcutManager.requestPinShortcut(pinShortcutInfo, null)
}
}
...
Чего мне не хватает? Связано ли это с типом pathPrefix
или MIME (для файлов .js
, по-видимому, его нет на Android)?