小型安卓 APP,需要加入动态调用外部存储权限,有偿求助 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuhuanpku
V2EX    问与答

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

  •  
  •   xuhuanpku 2018 年 1 月 23 日 2044 次点击
    这是一个创建于 2933 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    如果是进入功能时检测权限的就麻烦点( LinkedIn APP 就是这种),这个要加在功能入口出,对程序的模块化要求高点。
    chinvo
        6
    chinvo  
       2018 年 1 月 23 日
    你可以降低 target sdk version

    就可以继续在安装时请求权限了
    xuhuanpku
        7
    xuhuanpku  
    OP
       2018 年 1 月 24 日
    @XinLake 不给权限不运行吧,这个入口 Activity 是在哪找呢
    XinLake
        8
    XinLake  
       2018 年 1 月 24 日 via Android
    在 AndroidManifest.xml 里可以找到入口 activity
    xuhuanpku
        9
    xuhuanpku  
    OP
       2018 年 1 月 24 日
    @XinLake 直接修改 AndroidManifest.xml ?还是要改 classex.dex ?
    xuhuanpku
        10
    xuhuanpku  
    OP
       2018 年 1 月 24 日
    @zapper 直接写在 classes.dex 可以吗?
    XinLake
        11
    XinLake  
       2018 年 1 月 24 日
    @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 年 1 月 25 日
    @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="anroid.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 年 1 月 26 日
    @xuhuanpku 刚看到

    从你贴的代码看,应该是 com.z****n.z*q.Calculate 这个源码,这个是点击图标的入口 Activity。
    MainActivity 最好看看他的逻辑。
    Register 看名称应该不用管。
    xuhuanpku
        14
    xuhuanpku  
    OP
       2018 年 1 月 28 日
    @XinLake 还有人说,直接把数据保存位置从外部存储改成内部存储就可以了,这是不是更简单的方法?
    XinLake
        15
    XinLake  
       2018 年 1 月 28 日
    @xuhuanpku 是啊,这样也可以。这样你的 APP 就变成系统应用了,一般情况下没法卸载。root 身份可以删除
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2715 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 00:48 PVG 08:48 LAX 16:48 JFK 19:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86