flutter调用用kotlin编写自动生成检查并生成APP桌面快捷方式代码按照以上要求请提供完整代码以及导入包
由于具体需求和环境不清楚,下面是一个参考代码,仅供参考:
在Kotlin中实现自动生成检查并生成APP桌面快捷方式:
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.os.Build
import androidx.annotation.NonNull
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
fun createShortcut(context: Context, shortcutName: String, iconResource: Int, intent: Intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
createShortcutApi25(context, shortcutName, iconResource, intent)
} else {
createShortcutApi(context, shortcutName, iconResource, intent)
}
}
@RequiresApi(Build.VERSION_CODES.N_MR1)
private fun createShortcutApi25(context: Context, shortcutName: String, iconResource: Int, intent: Intent) {
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
if (shortcutManager.isRequestPinShortcutSupported) {
val shortcutInfo = ShortcutInfo.Builder(context, shortcutName)
.setShortLabel(shortcutName)
.setIcon(IconCompat.createWithBitmap(BitmapFactory.decodeResource(context.resources, iconResource)))
.setIntent(intent)
.build()
shortcutManager.requestPinShortcut(shortcutInfo, null)
}
}
private fun createShortcutApi(context: Context, shortcutName: String, iconResource: Int, intent: Intent) {
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
val shortcutInfo = ShortcutInfoCompat.Builder(context, shortcutName)
.setShortLabel(shortcutName)
.setIcon(IconCompat.createWithBitmap(BitmapFactory.decodeResource(context.resources, iconResource)))
.setIntent(intent)
.build()
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null)
}
}
fun isShortcutCreated(@NonNull context: Context, shortcutId: String): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
return isShortcutCreatedApi25(context, shortcutId)
} else {
return isShortcutCreatedApi(context, shortcutId)
}
}
@RequiresApi(Build.VERSION_CODES.N_MR1)
private fun isShortcutCreatedApi25(context: Context, shortcutId: String): Boolean {
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
val shortcuts = shortcutManager.dynamicShortcuts
for (shortcut in shortcuts) {
if (shortcut.id == shortcutId) {
return true
}
}
return false
}
private fun isShortcutCreatedApi(context: Context, shortcutId: String): Boolean {
if (ContextCompat.checkSelfPermission(context, "com.android.launcher.permission.READ_SETTINGS") != PackageManager.PERMISSION_GRANTED) {
return false
}
val authority = "${context.packageName}.launcher.settings"
val uri = Uri.parse("content://$authority/favorites?notify=true")
val projection = arrayOf("_id", "title", "iconResource")
val c = context.contentResolver.query(uri, projection, "title=?", arrayOf(shortcutId), null)
if (c != null && c.moveToFirst()) {
c.close()
return true
}
return false
}
在Flutter中调用Kotlin代码:
-
在Flutter项目的
android/app/src/main/kotlin目录下创建一个新的Kotlin文件,例如ShortcutUtil.kt。 -
在文件中添加上面的Kotlin代码。
-
在Flutter项目的
pubspec.yaml文件中添加Kotlin依赖项:
dependencies:
flutter:
sdk: flutter
kotlin:
classpath: org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50
- 在Flutter项目的
android/app/build.gradle文件中添加Kotlin插件和库依赖项:
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
- 在Flutter项目的
android/app/src/main/AndroidManifest.xml文件中添加权限:
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
- 在Flutter项目的Dart代码中调用Kotlin代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kotlin/kotlin.dart' as kotlin;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const platform = const MethodChannel('com.example.app/shortcut');
Future<void> _createShortcut() async {
try {
await platform.invokeMethod('createShortcut', {
'shortcutName': 'My App Shortcut',
'iconResource': 'ic_launcher',
'intent': {
'action': 'android.intent.action.VIEW',
'data': 'https://www.example.com',
},
});
} on PlatformException catch (e) {
print("Failed to create shortcut: ${e.message}");
}
}
Future<void> _checkShortcut() async {
bool isCreated = await kotlin.isShortcutCreated(context, 'My App Shortcut');
print("Shortcut is created: $isCreated");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Press the button to create a shortcut:',
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_createShortcut();
_checkShortcut();
},
tooltip: 'Create Shortcut',
child: Icon(Icons.add),
),
);
}
}
``
原文地址: https://www.cveoy.top/t/topic/eokK 著作权归作者所有。请勿转载和采集!