file_access_settings_return 1.0.1
file_access_settings_return: ^1.0.1 copied to clipboard
A lightweight Flutter plugin that helps Android apps return to the foreground after users complete file access authorization in system settings.
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:file_access_settings_return/file_access_settings_return.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _plugin = FileAccessSettingsReturn();
bool _hasPermission = false;
bool _isRequesting = false;
@override
void initState() {
super.initState();
_checkPermission();
}
Future<void> _checkPermission() async {
final hasPermission = await _plugin.hasStoragePermission();
if (mounted) {
setState(() => _hasPermission = hasPermission);
}
}
Future<void> _requestPermission() async {
if (_isRequesting) return;
setState(() => _isRequesting = true);
try {
// Notify native: about to enter permission page
await _plugin.notifyEnterPermissionPage();
// Request permission (opens system settings on Android 11+)
final result = await _requestFilePermission();
// Cancel polling after returning from settings
await _plugin.cancelPermissionPolling();
setState(() {
_hasPermission = result;
_isRequesting = false;
});
} catch (e) {
await _plugin.cancelPermissionPolling();
setState(() => _isRequesting = false);
}
}
Future<bool> _requestFilePermission() async {
if (!Platform.isAndroid) return true;
final androidInfo = await DeviceInfoPlugin().androidInfo;
final sdkInt = androidInfo.version.sdkInt;
if (sdkInt >= 30) {
final status = await Permission.manageExternalStorage.request();
return status.isGranted;
} else {
final status = await Permission.storage.request();
return status.isGranted;
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('File Access Settings Return')),
body: Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Icon(
_hasPermission ? Icons.folder_open : Icons.folder,
size: 80,
color: _hasPermission ? Colors.blue : Colors.grey,
),
const SizedBox(height: 24),
Text(
_hasPermission
? 'File access permission granted'
: 'File access permission required',
style: const TextStyle(fontSize: 18),
textAlign: TextAlign.center,
),
const SizedBox(height: 12),
Text(
_hasPermission
? 'You can now access files on this device.'
: 'This app needs file access permission to manage your files. '
'Tap the button below to grant permission.',
style: TextStyle(fontSize: 14, color: Colors.grey[600]),
textAlign: TextAlign.center,
),
const SizedBox(height: 32),
if (!_hasPermission)
ElevatedButton(
onPressed: _isRequesting ? null : _requestPermission,
child: _isRequesting
? const SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Text('Grant File Access Permission'),
),
if (_hasPermission)
ElevatedButton(
onPressed: _checkPermission,
child: const Text('Refresh Status'),
),
],
),
),
),
),
);
}
}