V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xuhuanpku
V2EX  ›  问与答

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

  •  
  •   xuhuanpku · 2018-01-23 15:24:51 +08:00 · 1611 次点击
    这是一个创建于 2500 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    15 条回复    2018-01-28 21:28:42 +08:00
    xuhuanpku
        1
    xuhuanpku  
    OP
       2018-01-23 15:27:14 +08:00
    发错版面,求删
    xuhuanpku
        3
    xuhuanpku  
    OP
       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
        4
    zapper  
       2018-01-23 19:34:58 +08:00
    java 代码任意位置,至少得在你写外部存储之前
    XinLake
        5
    XinLake  
       2018-01-23 21:32:47 +08:00
    你不是程序员搞这事就比较麻烦了,这东西还得要调试,不是程序员很难搞好。我搞过这种案例,但是我不用 QQ。

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

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

    就可以继续在安装时请求权限了
    xuhuanpku
        7
    xuhuanpku  
    OP
       2018-01-24 18:33:40 +08:00
    @XinLake 不给权限不运行吧,这个入口 Activity 是在哪找呢
    XinLake
        8
    XinLake  
       2018-01-24 19:53:42 +08:00 via Android
    在 AndroidManifest.xml 里可以找到入口 activity
    xuhuanpku
        9
    xuhuanpku  
    OP
       2018-01-24 21:12:37 +08:00
    @XinLake 直接修改 AndroidManifest.xml ?还是要改 classex.dex ?
    xuhuanpku
        10
    xuhuanpku  
    OP
       2018-01-24 21:27:17 +08:00
    @zapper 直接写在 classes.dex 可以吗?
    XinLake
        11
    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
        12
    xuhuanpku  
    OP
       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
        13
    XinLake  
       2018-01-26 15:06:37 +08:00
    @xuhuanpku 刚看到

    从你贴的代码看,应该是 com.z****n.z*q.Calculate 这个源码,这个是点击图标的入口 Activity。
    MainActivity 最好看看他的逻辑。
    Register 看名称应该不用管。
    xuhuanpku
        14
    xuhuanpku  
    OP
       2018-01-28 21:19:41 +08:00
    @XinLake 还有人说,直接把数据保存位置从外部存储改成内部存储就可以了,这是不是更简单的方法?
    XinLake
        15
    XinLake  
       2018-01-28 21:28:42 +08:00
    @xuhuanpku 是啊,这样也可以。这样你的 APP 就变成系统应用了,一般情况下没法卸载。root 身份可以删除
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5562 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:50 · PVG 14:50 · LAX 22:50 · JFK 01:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.