create user shorcut on Android

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-04-05 17:46:25 +08:00
parent f0d9b3a9a7
commit 51163dd985
3 changed files with 78 additions and 4 deletions

View File

@@ -1,11 +1,16 @@
package com.example.piliplus package com.example.piliplus
import android.app.PendingIntent
import android.app.PictureInPictureParams import android.app.PictureInPictureParams
import android.app.SearchManager import android.app.SearchManager
import android.content.ComponentName import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.BitmapFactory
import android.graphics.drawable.Icon
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore import android.provider.MediaStore
@@ -16,6 +21,7 @@ import com.ryanheise.audioservice.AudioServiceActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
import kotlin.system.exitProcess import kotlin.system.exitProcess
import java.io.File
class MainActivity : AudioServiceActivity() { class MainActivity : AudioServiceActivity() {
private lateinit var methodChannel: MethodChannel private lateinit var methodChannel: MethodChannel
@@ -133,6 +139,38 @@ class MainActivity : AudioServiceActivity() {
} }
} }
"createShortcut" -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try {
val shortcutManager =
context.getSystemService(ShortcutManager::class.java)
if (shortcutManager.isRequestPinShortcutSupported) {
val id = call.argument<String>("id")!!
val uri = call.argument<String>("uri")!!
val label = call.argument<String>("label")!!
val icon = call.argument<String>("icon")!!
val bitmap = BitmapFactory.decodeFile(icon)
val shortcut =
ShortcutInfo.Builder(context, id)
.setShortLabel(label)
.setIcon(Icon.createWithAdaptiveBitmap(bitmap))
.setIntent(Intent(Intent.ACTION_VIEW, uri.toUri()))
.build()
val pinIntent =
shortcutManager.createShortcutResultIntent(shortcut)
val pendingIntent = PendingIntent.getBroadcast(
context, 0, pinIntent, PendingIntent.FLAG_IMMUTABLE
)
shortcutManager.requestPinShortcut(
shortcut,
pendingIntent.intentSender
)
}
} catch (e: Exception) {
}
}
}
else -> result.notImplemented() else -> result.notImplemented()
} }
} }

View File

@@ -28,6 +28,7 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
MemberController({required this.mid}); MemberController({required this.mid});
int mid; int mid;
String? username; String? username;
String? userAvatar;
late final account = Accounts.main; late final account = Accounts.main;
@@ -71,7 +72,10 @@ class MemberController extends CommonDataController<SpaceData, SpaceData?>
final data = response.response; final data = response.response;
final card = data.card; final card = data.card;
username = card?.name ?? ''; username = card?.name ?? '';
userAvatar = card?.face;
isFollowed = card?.relation?.isFollowed; isFollowed = card?.relation?.isFollowed;
// charge // charge
final elec = data.elec; final elec = data.elec;
charges = elec?.list; charges = elec?.list;

View File

@@ -34,12 +34,15 @@ import 'package:PiliPlus/pages/member_video_web/archive/view.dart';
import 'package:PiliPlus/pages/member_video_web/season_series/view.dart'; import 'package:PiliPlus/pages/member_video_web/season_series/view.dart';
import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart';
import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -380,11 +383,9 @@ class _MemberPageState extends State<MemberPage> {
], ],
), ),
), ),
if (kDebugMode || Platform.isIOS) if (kDebugMode || PlatformUtils.isMobile)
PopupMenuItem( PopupMenuItem(
onTap: () => PageUtils.launchURL( onTap: _createShortcut,
'https://www.bilibili.com/blackboard/disablelink/go-to-up-space.html?mid=$_mid',
),
child: const Row( child: const Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@@ -688,4 +689,35 @@ class _MemberPageState extends State<MemberPage> {
SmartDialog.showToast(e.toString()); SmartDialog.showToast(e.toString());
} }
} }
void _createShortcut() {
if (Platform.isIOS) {
PageUtils.launchURL(
'https://www.bilibili.com/blackboard/disablelink/go-to-up-space.html?mid=$_mid',
);
} else if (Platform.isAndroid) {
_createShortcutAndroid();
}
}
Future<void> _createShortcutAndroid() async {
try {
SmartDialog.showLoading();
final file = (await DefaultCacheManager().getSingleFile(
'${_userController.userAvatar!}@200w_200h.webp'.http2https,
));
SmartDialog.dismiss();
await Utils.channel.invokeMethod(
'createShortcut',
<String, String>{
'id': _userController.mid.toString(),
'uri': 'bilibili://space/${_userController.mid}',
'label': _userController.username!,
'icon': file.path,
},
);
} catch (e) {
SmartDialog.showToast(e.toString());
}
}
} }