小型安卓 APP,需要加入动态调用外部存储权限,有偿求助

2018-01-23 15:24:51 +08:00
 xuhuanpku

自己的小 APP,以前手机版本比较低,只是在 AndroidManifest.xml 写入了调用外部存储权限,但是现在手机升级之后,必须动态调用权限,求帮忙 QQ:5194434

1588 次点击
所在节点    问与答
15 条回复
xuhuanpku
2018-01-23 15:27:14 +08:00
发错版面,求删
zapper
2018-01-23 15:27:58 +08:00
xuhuanpku
2018-01-23 19:07:53 +08:00
@zapper 多谢,不过我不是程序员,我查到可以加入这些代码

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};

public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}

不过这是应该加在哪呢?有人说是 Activity ?难道是在 AndroidManifest.xml 里面?
zapper
2018-01-23 19:34:58 +08:00
java 代码任意位置,至少得在你写外部存储之前
XinLake
2018-01-23 21:32:47 +08:00
你不是程序员搞这事就比较麻烦了,这东西还得要调试,不是程序员很难搞好。我搞过这种案例,但是我不用 QQ。

如果是不给权限不运行的那种好办点(大部分国产 APP 就这样),加在你的入口 Activity 里,检测到权限没有授予就弹个提示,等待授权。

如果是进入功能时检测权限的就麻烦点( LinkedIn APP 就是这种),这个要加在功能入口出,对程序的模块化要求高点。
chinvo
2018-01-23 21:34:48 +08:00
你可以降低 target sdk version

就可以继续在安装时请求权限了
xuhuanpku
2018-01-24 18:33:40 +08:00
@XinLake 不给权限不运行吧,这个入口 Activity 是在哪找呢
XinLake
2018-01-24 19:53:42 +08:00
在 AndroidManifest.xml 里可以找到入口 activity
xuhuanpku
2018-01-24 21:12:37 +08:00
@XinLake 直接修改 AndroidManifest.xml ?还是要改 classex.dex ?
xuhuanpku
2018-01-24 21:27:17 +08:00
@zapper 直接写在 classes.dex 可以吗?
XinLake
2018-01-24 21:55:47 +08:00
@xuhuanpku

在 APP 源码的 AndroidManifest.xml 文件里查找有如下内容的 <activity> 标签
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
这个就是入口 activity,是用户点击图标时 Launcher 启动 APP 的默认 Activity。

找到后可以定位到该入口 activity 的源码,包名+activity 的 name。在 java 源码处加入权限检测和申请逻辑。可以下参考请求权限的文档:
https://developer.android.google.cn/reference/android/app/Activity.html#requestPermissions(java.lang.String[], int)

如果 APP 设计了封面 activity,就是用来检测权限环境等作用的,那就好加点。如果没有这个设计,那就麻烦点。不过这种事情要是找软件工程师估计就是现场解决的事情。



你说的改 classes.dex ,那是改 APK 么?我没改过别人的东西,没法回答你。
xuhuanpku
2018-01-25 21:07:00 +08:00
@XinLake

从我这个 AndroidManifest.xml 看,应该就是改 com/z****q/z*q/MainActivity 这个源码吧,后门的 Register 和 Calculate 不用管吧

——————————————————————————————————————————————————

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.z****n.z*q" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application android:allowBackup="true" android:icon="@mipmap/logo" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name="com.z****n.z*q.MainActivity"/>
<activity android:name="com.z****n.z*q.Register"/>
<activity android:name="com.z****n.z*q.Calculate">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.z****n.z*q.Trend" android:theme="@android:style/Theme.Dialog"/>
<activity android:launchMode="singleTask" android:name="com.tencent.tauth.AuthActivity" android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="tencent1105533418"/>
</intent-filter>
</activity>
<activity android:configChanges="keyboardHidden|orientation|screenSize" android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<activity android:name="com.z****n.z*q.LoginViaQQ"/>
</application>
</manifest>
XinLake
2018-01-26 15:06:37 +08:00
@xuhuanpku 刚看到

从你贴的代码看,应该是 com.z****n.z*q.Calculate 这个源码,这个是点击图标的入口 Activity。
MainActivity 最好看看他的逻辑。
Register 看名称应该不用管。
xuhuanpku
2018-01-28 21:19:41 +08:00
@XinLake 还有人说,直接把数据保存位置从外部存储改成内部存储就可以了,这是不是更简单的方法?
XinLake
2018-01-28 21:28:42 +08:00
@xuhuanpku 是啊,这样也可以。这样你的 APP 就变成系统应用了,一般情况下没法卸载。root 身份可以删除

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/425265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX