运行时权限对于确保您的应用程序在Android 6+设备上获得所需的运行权限至关重要,但是,似乎一些顶级开发人员(gameloft,ea游戏)不需要实现运行时权限,并且他们对目标SDK 22非常满意。所以我的问题是:
为什么我需要承担添加运行时权限的痛苦,当我可以留在api 22时。这也会节省一些代码行。
应用发布后,是否可以从目标SDK 22升级到目标SDK 23?如果我打算暂时停留在SDK 22上。似乎降级是不可能的。 &#34; 请注意,一旦您发布了APK目标API级别23或更高级别,您就无法在任何渠道上提交针对API级别22或更低级别的更新。&#34; < / p>
答案 0 :(得分:3)
为什么我需要承担添加运行时权限的痛苦,当我可以留在api 22时
你的“我可以留在api 22”假设可能不会随着时间的推移而保持良好状态。例如,系统会告诉用户您的应用与多窗口不兼容。
此外,用户看到该应用程序在安装时不会立即支持运行时权限,因为它们会在经典安装时权限对话框中提示。随着时间的推移,用户会开始认为显示该对话框的应用已过期且未进行维护,因此他们可能无法安装您的应用。
此外,您可能想要使用的某些第三方库可能会坚持更高import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyCustomCard extends StatelessWidget {
MyCustomCard({ this.colors });
final MaterialColor colors;
Widget build(BuildContext context) {
return new Container(
alignment: FractionalOffset.center,
height: 144.0,
width: 360.0,
decoration: new BoxDecoration(
color: colors.shade50,
border: new Border.all(color: new Color(0xFF9E9E9E)),
),
child: new FlutterLogo(size: 100.0, colors: colors),
);
}
}
class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
AnimationController _controller;
Animation<double> _frontScale;
Animation<double> _backScale;
@override
void initState() {
super.initState();
_controller = new AnimationController(
vsync: this,
duration: const Duration(seconds: 1),
);
_frontScale = new Tween(
begin: 1.0,
end: 0.0,
).animate(new CurvedAnimation(
parent: _controller,
curve: new Interval(0.0, 0.5, curve: Curves.easeIn),
));
_backScale = new CurvedAnimation(
parent: _controller,
curve: new Interval(0.5, 1.0, curve: Curves.easeOut),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
ThemeData theme = Theme.of(context);
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.flip_to_back),
onPressed: () {
setState(() {
if (_controller.isCompleted || _controller.velocity > 0)
_controller.reverse();
else
_controller.forward();
});
},
),
body: new Center(
child: new Stack(
children: <Widget>[
new AnimatedBuilder(
child: new MyCustomCard(colors: Colors.orange),
animation: _backScale,
builder: (BuildContext context, Widget child) {
final Matrix4 transform = new Matrix4.identity()
..scale(1.0, _backScale.value, 1.0);
return new Transform(
transform: transform,
alignment: FractionalOffset.center,
child: child,
);
},
),
new AnimatedBuilder(
child: new MyCustomCard(colors: Colors.blue),
animation: _frontScale,
builder: (BuildContext context, Widget child) {
final Matrix4 transform = new Matrix4.identity()
..scale(1.0, _frontScale.value, 1.0);
return new Transform(
transform: transform,
alignment: FractionalOffset.center,
child: child,
);
},
),
],
),
),
);
}
}
。
所以,从技术上讲,你可以拥有任何你想要的targetSdkVersion
,但是有成本。
这也可以保存一些代码行。
不一定。用户仍然可以在“设置”中撤消这些权限,因此您可能需要比以前更多的错误处理代码。
应用发布后,是否可以从目标SDK 22升级到目标SDK 23?
一般来说,是的。