精华内容
下载资源
问答
  • 引用网易的直播api,但是每次打开浏览器都报出获取不到麦克风、摄像头的错误
  • Log打出来发现是:unabie to query for permission:android.webkit.permission.plugin我没有使用过这个权限 ,就自己一个人琢磨了老半天,度娘那里也搜寻了半天没有详细的说明。刚开始是小八以为是没有动态获取,...

    大家好,我是新人小八,

     得意

    昨天在群里看见一个朋友问了一个问题,应用在模拟器上面能够跑起来,但是在手机上跑就会出现黑屏。

    Log打出来发现是:

    unabie to query for permission:android.webkit.permission.plugin



    我没有使用过这个权限 ,就自己一个人琢磨了老半天,度娘那里也搜寻了半天没有详细的说明。

    刚开始是小八以为是没有动态获取,可是发现写这个权限的时候根本没有任何提示,

    转头一想可能是官方把这个权限删除掉了。委屈


    解决办法:

    将该权限删除,再运行项目,查看Log



    第一次写博客,有点紧张 ,望见谅偷笑

    因为是别人的项目,也不好去看源码。








     走过人山人海 , 也没能看见你 

    展开全文
  • 项目中会使用到摄像头或麦克风设备,这就需要我们获取浏览器的摄像头和麦克风权限权限是无法通过js操控的,必须由浏览器用户设置。 下面我来高数大家如何获取浏览器的摄像头或麦克风的权限,使浏览器弹出询问窗口...

    文章目录


    前言

    项目中会使用到摄像头或麦克风设备,这就需要我们获取浏览器的摄像头和麦克风权限,权限是无法通过js操控的,必须由浏览器用户设置。


    下面我来告诉大家如何获取浏览器的摄像头或麦克风的权限,使浏览器弹出询问窗口。

    一、我们想要实现的效果,浏览器弹出摄像头或麦克风权限询问窗口?

    如图,浏览器询问用户,允许或禁止浏览器使用您的摄像头或麦克风

    二、实现方法

    1.首先判断浏览器是否支持getUserMedia方法

    代码如下(示例):

    navigator.getUserMedia  = navigator.getUserMedia ||
                              navigator.webkitGetUserMedia ||
                              navigator.mozGetUserMedia ||
                              navigator.msGetUserMedia;
     
    if (navigator.getUserMedia) {
        // 支持
    } else {
        // 不支持
    }
    

     

    2.实现浏览器询问用户,是否同意浏览器调用麦克风或摄像头

    在浏览器支持getUserMedia方法的前提下,我们可以直接调用getUserMedia,其中video询问摄像头权限,audio询问麦克风权限

    代码如下(示例):

    navigator.getUserMedia({video: true,audio:true}, function onSuccess(stream) {
        console.log('已点击允许,开启成功');
    }, function onError(error) {
        console.log("错误:", error);
    });
    

     

    展开全文
  • android 设置默认浏览器

    千次阅读 2013-08-26 21:39:14
    我们的浏览器要添加的一个功能:设置为默认浏览器,大部分的浏览器都有这个功能,比如UC,百度,360等优秀的产品。 1.http://blog.csdn.net/liws2010/article/details/7452957 2....

    我们的浏览器要添加的一个功能:设置为默认浏览器,大部分的浏览器都有这个功能,比如UC,百度,360等优秀的产品。


    1.http://blog.csdn.net/liws2010/article/details/7452957

    2.http://hi.baidu.com/519177819/item/853df8228a8c0c182b0f1cbe

    3.http://www.linuxidc.com/Linux/2013-04/82442.htm

    4.http://blog.csdn.net/ldinvicible/article/details/8363402

    5.http://blog.csdn.net/baolin1389/article/details/6394409

    6.http://www.devdiv.com/Android-intent_-thread-122395-1-1.html

    7.http://blog.sina.com.cn/s/blog_74c22b210100us1h.html

    8.http://hi.baidu.com/kyojfe/item/b2ea8ab72326d2ee4fc7fd84

    9.http://www.eoeandroid.com/forum.php?mod=viewthread&tid=54816

    10.http://www.eoeandroid.com/forum.php?mod=viewthread&tid=283486

    11.http://stackoverflow.com/questions/13167583/clearing-and-setting-the-default-home-application-solved?rq=1

    12.http://www.eoeandroid.com/forum.php?mod=viewthread&tid=283486

    13.http://stackoverflow.com/questions/3836215/android-change-default-home-application

    14.http://stackoverflow.com/questions/2583966/how-do-i-use-packagemanager-addpreferredactivity/3968856#3968856

    15.http://stackoverflow.com/questions/3836215/android-change-default-home-application/4649272#4649272



    http://hold-on.iteye.com/blog/1827790


     

    最新研究:2013-10-31


    一.新发现
    1.在android的manifest要添加这个权限:就是设置某个应用为系统默认应用的权限,具体自行查寻。
      <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />

    2. 在应用程序的AndroidManifest.xml中的manifest节点中加入 android:sharedUserId="android.uid.system"这个属性。

    3.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

    4. 使用mm命令来编译,生成的apk就有系统权限了。

    上面这4个步骤是我之前研究的时候整理的,大家都这么说的,后来发生了一次事故,我发现原来不是这样的。

    请注意下面这句话:
        如果你的应用之前没有加android:sharedUserId="android.uid.system"这个属性,你突然加了这个属性,然后你会发现,你之前的数据库文件没有了,别的文件,我没注意,反正你的数据库文件肯定是没有了,我觉得你的应用的data目录下的所有数据应该都会被清空了,但是没有验证过哈。后来问了做系统的同事,他解释了一下,我也没太懂:就是当你的应用从普通的用户进程变成系统进程的时候,会检测,发现进程变了,就会清空你的数据。
        之前我一直觉得配置这个属性:android:sharedUserId="",比如做一个应用的皮肤的时候,你的皮肤应用和主应用的sharedUserId一样的话,可以互相读取数据,主应用可以读取皮肤apk的数据。原来细细的深究下,android:sharedUserId="",系统本身提供了4个值,具体自行百度查询。

        后来没有办法了,我就尝试上面的3个修改,去掉一个留下2个,看是哪个修改造成了浏览器的数据库被清空,发现是
    android:sharedUserId="android.uid.system"造成了问题,但是为了获取系统权限,我不加这个能行么?我报着试一试的态度,发现,是可行的。就是说:去掉android:sharedUserId="android.uid.system"这个,只要配置了LOCAL_CERTIFICATE := platform,一样能获取系统权限。

    二.新尝试

        最近改了编译系统,不用android那套编译系统了,所以没有Android.mk文件这个文件了,那我怎么才能获取系统权限呢?这个让我纠结了,继续查找答案。发现了一个:
    http://blog.csdn.net/lili1985516/article/details/7754672
    结果,按照上面说的第二个方法去做了,发现是可以的,真的,用那两个证书去签名,真的可以获取系统权限。
    注意signapk.jar的执行方式 ,网上看了很多,就下面这个是对的,其它的都不好用,也可能是我用错了:不过这个肯定是可用的,我验证过了。
    java -jar signapk.jar xxx.x509.pem xxx.pk8 xxxxx.apk xxxxx-signed.apk (xxx是证书名,xxxxx是所签apk的名字)

    下面是上面链接的原文:
     第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

      1. 在应用程序的AndroidManifest.xml中的manifest节点中加入

      android:sharedUserId="android.uid.system"这个属性。

      2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

      3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

      第二个办法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

      1. 同上,加入android:sharedUserId="android.uid.system"这个属性。

      2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

      3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

      4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,

      首先找到密钥文件,在我的Android源码目录中的位置

      是"build        argetproductsecurity",下面的platform.pk8和platform.x509.pem

      两个文件。

      然后用Android提供的Signapk工具来签名,signapk的源代码是

      在"build        oolssignapk"下,

      用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",

      文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

      这样最后得到的apk和第一个方法是一样的。

      最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

      只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform

    key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。  这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到 platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android 中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。  最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

    1.signapk.jar执行方式
    java -jar signapk.jar xxx.x509.pem xxx.pk8 xxxxx.apk xxxxx-signed.apk (xxx是证书名,xxxxx是所签apk的名字)

    2.相关文件路径
    编译后的JAR包位置 android\out\host\linux-x86\framework\signapk.jar
    证书文件位置  android\build\target\product\security
    signapk.java文件位置   android\build\tools\signapk\SignApk.java

    附件为本人修改后的jar包,添加了密码输入,在ant脚本中运行时很有用,呵~
    使用方法:
    signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar passward




    参考:

    http://blog.csdn.net/hudashi/article/details/7080062

    http://blog.csdn.net/hmg25/article/details/6447067

    http://blog.csdn.net/vincent_czz/article/details/7199567




    展开全文
  • Android之设置当前app为默认浏览器研究

    千次阅读 多人点赞 2020-11-18 22:04:57
    把当前app设置为默认浏览器 2 主要思路 分析竞品,我们主要是通过打开一个链接,让用户去选择默认(如果这个时候已经设置其它app为默认了我们需要删除这个app的默认设置,才能进行我们app的...

    1 需求

    把当前app设置为默认浏览器

     

     

     

     

     

     

     

     

     

     

     

    2 主要思路

    分析竞品,我们主要通过2种方式设置app为默认浏览器

    • 直接跳 手机“设置默认应用”界面来让用户选择 默认浏览器为哪个app
    • 打开一个链接,拉起手机所有浏览器,让用户去选择哪个浏览器,并且只有点击“始终”才会生效,仅仅点击“仅此一次”,还是会设置失败,如果这种打开链接拉页面方式已经设置其它app为默认浏览器了,我们需要手动把app “清除默认设置“ 去掉,才能进行打开一个链接,拉起手机所有浏览器,让用户去选择)

     

     

     

     

     

     

     

     

     

     

     

     

    3 难点

    • 判断当前手机有没有哪个app设置了默认浏览器
    • 判断当前的app有没有设置默认浏览器成功
    • 适配各种手机厂家和不同手机厂家的手机安卓版本具体是采用跳链接还是让用户打开“设置默认应用”界面来让用户选择。

    我研究了 QQ浏览器(可以非常精准的判断)、edge浏览器、猎豹浏览器、apus浏览器等等,再网上找了一些判断当前设置默认浏览器的app判断函数,下面的代码对华为手机判断还是很准,但是其它手机不行,问题太大了,所以再次研究。

        public static ArrayList getDefaultBrowserList(Context paramContext) {
            getDefaultActivityPackageName(paramContext);
            ArrayList localArrayList1 = new ArrayList();
            PackageManager localPackageManager = paramContext.getPackageManager();
            Intent localIntent = new Intent("android.intent.action.VIEW");
            localIntent.addCategory("android.intent.category.BROWSABLE");
    //        localIntent.setData(Uri.parse("http://bbs.liebao.cn"));
            localIntent.setData(Uri.parse("http://www.baidu.com"));
            try {
                List localList2 = localPackageManager.queryIntentActivities(localIntent, 0);
                List localList1 = null;
                if (localList2 != null) {
                    Log.i(TAG, "localList2 size is " + localList2.size());
                } else {
                    Log.i(TAG, "localList2 == null");
                }
                localList1 = localList2;
                if (localList1 != null) {
                    ArrayList localArrayList2 = new ArrayList();
                    ArrayList localArrayList3 = new ArrayList();
                    Iterator localIterator1 = localList1.iterator();
                    while (localIterator1.hasNext()) {
                        ResolveInfo localResolveInfo = (ResolveInfo) localIterator1.next();
                        Log.i(TAG, "localResolveInfo.activityInfo.packageName is " + localResolveInfo.activityInfo.packageName);
                        localPackageManager.getPreferredActivities(localArrayList3, localArrayList2, localResolveInfo.activityInfo.packageName);
                        Log.i(TAG, "localArrayList2 size is:" + localArrayList2.size());
                        Log.i(TAG, "localArrayList3size is:" + localArrayList3.size());
                        Iterator localIterator2 = localArrayList3.iterator();
                        while (localIterator2.hasNext()) {
                            IntentFilter localIntentFilter = (IntentFilter) localIterator2.next();
                            if (((!localIntentFilter.hasCategory("android.intent.category.BROWSABLE")) && (!localIntentFilter.hasCategory("android.intent.category.DEFAULT"))) || (!localIntentFilter.hasDataScheme("http")))
                                continue;
                            localArrayList1.add(localResolveInfo);
                        }
                    }
                }
            } catch (Exception localException) {
                Log.i(TAG, "getDefaultBrowserList has error");
            }
            Log.i(TAG, "localArrayList1 size is:" + localArrayList1.size());
    //        String packageName = G(paramContext);
    //        String newPackageName = E(paramContext);
    //        Log.i(TAG, "G packageName is:" + packageName);
    //        Log.i(TAG, "E newPackageName is:" + newPackageName);
            return localArrayList1;
        }
    
    
        /**
         * 判断当前hw是不是是不是设置
         */
        public static boolean huaweiIsSetDefaultBrowserSuccess(Context context) {
            if (context == null) return false;
            String packageName = findPackageNameOfDefaultBrowser(context);
            if (TextUtils.isEmpty(packageName)) {
                return false;
            }
            if (packageName.equals(context.getPackageName())) {
                return true;
            }
            return false;
        }

     

     

     

     

     

    4 需要注意的地方

    通过打开一个链接,调用系统所有浏览器的app进行选择的时候,如何让系统知道我们当前的app也是浏览器类型呢?需要在我们的AndroidManifest.xml里面进行设置,不然系统不会拉起我们的app让你选择。

            <activity android:name=".ui.MainActivity">
     
                <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="http"/>
                    <data android:scheme="https"/>
                    <data android:scheme="about"/>
                    <data android:scheme="javascript"/>
                </intent-filter>
            </activity>

     

     

     

     

     

     

     

     

    5 部分帮助代码以及使用

        public static final String OPEN_PAGE_TYPE = "openPageType";
        public static final String OPEN_SETTINGS_TYPE = "openSettinggType";
        public static final String OPEN_DELETE_FAULT_SETTINGS = "openDeleteFaultSettings";

    上面这3个类型意思是,

    • OPEN_SETTINGS_TYPE      直接调用系统设置页面进行设置
    • OPEN_PAGE_TYPE     直接通过打开一个链接,让系统拉起很多浏览器app,让用户自己去点击"始终"选择进行设置
    • OPEN_DELETE_FAULT_SETTINGS 直接通过打开一个链接,让系统拉起很多浏览器app,让用户自己去点击"始终"选择进行设置,这不过这里已经设置了其它app为默认浏览器,我们需要手动把app “清除默认设置“ 去掉,然后再通过OPEN_SETTINGS_TYPE这种方式进行设置

     

    我们需要第一步获取手机当前设置的类型

    var type = SetDefaultBrowserUtil.getSetBrowserType(context)

    然后更具不同的类型去跳引导页面,到底是打开一个链接,让用户去选择默认或者直接跳 手机“设置默认应用”界面来让用户选择。

     

    package com.example.testdragrecycleview;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.net.Uri;
    import android.os.Build;
    import android.provider.Settings;
    import android.text.TextUtils;
    import android.util.Log;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    
    public class SetDefaultBrowserUtil {
    
        public static final String TAG = "SetDefaultBrowserUtil";
    
        public static final int RESPONSE_CODE = 100;
    
        private static final String SCHEME = "package";
        /**
         * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
         */
        private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
        /**
         * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
         */
        private static final String APP_PKG_NAME_22 = "pkg";
        /**
         * InstalledAppDetails所在包名
         */
        private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
        /**
         * InstalledAppDetails类名
         */
        private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
    
        public static final String XIAOMI = "xiaomi";
        public static final String HUAWEI = "huawei";
        public static final String SAMSUNG = "samsung";
        public static final String VIVO = "vivo";
        public static final String OPPO = "oppo";
        public static final String MEIZU = "meizu";
        public static final String ONEPLUS = "oneplus";
        public static final String NUBIA = "nubia";
        public static final String GOOGLE = "google";
        public static final String OTHER = "other";
    
        public static final String OPEN_PAGE_TYPE = "openPageType";
        public static final String OPEN_SETTINGS_TYPE = "openSettinggType";
        public static final String OPEN_DELETE_FAULT_SETTINGS = "openDeleteFaultSettings";
    
    
        //这里oppo Android9.0的默认浏览器包名
        public static final String OPPO_DEFAULT_BROWSER_PACKAGE = "com.coloros.browser";
        //这里三星手机 没有设置默认浏览器的包名是 android
        public static final String SAMSUNG_DEFAULT_BROWSER_PACKAGE = "android";
        //这里是华为手机Android9.0、8.0没有设置浏览器获取到的包名ResolveInfo{58dbf6d com.huawei.android.internal.app/.HwResolverActivity m=0x0};pkgName = com.huawei.android.internal.app
        // 华为手机自带的浏览器包名是:com.android.browser 但是我们有权限可以去除默认设置,
    
        //华为10,没有设置默认浏览器的时候我们获取到的包名是com.huawei.browser,10.0我们检测出来不像9.0一样,拉起链接会直接跳过去,不过com.huawei.browser这个包名也是华为系统自带的浏览器包名,
        //华为5.0,启动我们获取到的默认浏览器是 com.huawei.browser,去去除默认设置去不掉,通过网页拉但是就直接挑错去
        public static final String HUAWEI_DEFAULT_BROWSER_PACKAGE = "com.huawei.android.internal.app"; //之前的判断对华为还是比较有效果
    
        // 小米和红米手机自带的浏览器包名是:com.android.browser 我们没有权限可以去除默认设置,getSetBrowserType packageName is:com.android.browser
        public static final String XIAOMI_DEFAULT_BROWSER_PACKAGE = "com.huawei.android.internal.app"; //之前的判断对华为还是比较有效果
    
        //google手机
    
        //魅族手机如果选择了,手机系统自带的浏览器,就没有权限,去除默认,所以,通过网页方式拉有缺陷,QQ浏览器也是通过设置界面去拉
        public static final String GOOGLE_DEFAULT_BROWSER_PACKAGE = "android";
    
        /**
         * 得到手机支持哪种设置类型
         * @param phoneType
         * @return
         */
        public static String getDefaultSupportType(String phoneType) {
            switch (phoneType) {
                case OPPO:
                case XIAOMI:
                case SAMSUNG:
                case VIVO:
                case MEIZU:
                    return OPEN_SETTINGS_TYPE;
                case HUAWEI:
                    int version = android.os.Build.VERSION.SDK_INT;
                    if (version == Build.VERSION_CODES.O_MR1 || version == Build.VERSION_CODES.N || version == Build.VERSION_CODES.Q) {
                        return OPEN_SETTINGS_TYPE;
                    } else {
                        return OPEN_PAGE_TYPE;
                    }
                default:
                    return OPEN_PAGE_TYPE;
            }
        }
    
        /**
         * 设置默认浏览器
         *
         * @param context
         */
        public static void setDefalutBrowser(Activity context) {
            String phoneType = getPhoneType();
            String supportType = getDefaultSupportType(phoneType);
            if (OPEN_SETTINGS_TYPE.equals(supportType)) {
                if (SAMSUNG.equals(phoneType)) {
                    openSamsung(context);
                } else if (OPPO.equals(phoneType) || XIAOMI.equals(phoneType) || VIVO.equals(phoneType)) {
                    openXiaomiOrOppo(context);
                } else if (HUAWEI.equals(phoneType)) {
                    goHuawei(context);
                } else if (MEIZU.equals(phoneType)) {
                    openMeizu(context);
                }
            } else {
                //这里暂时直接写死,用户可以根据自己的需要写上需要跳转的链接
                String url = "https://www.baidu.com";
                setDefaultBrowserByLink(context, url);
            }
        }
    
        /**
         * 判断当前app设置默认浏览器为哪种类型
         * @param context
         * @return
         */
        public static String getSetBrowserType(Context context) {
            if (context == null) {
                return OPEN_PAGE_TYPE;
            }
            String packageName = "";
            String phoneType = getPhoneType();
            packageName = getDefaultActivityPackageName(context);
            Log.i(TAG, "getSetBrowserType packageName is:" + packageName);
            if (OPPO.equals(phoneType) || VIVO.equals(phoneType) || XIAOMI.equals(phoneType)) {
                //oppo手机不能通过是拉取的方式,因为手机默认包名是com.coloros.browser,然后不能去除这个浏览器的默认设置,所以不能通过拉的方式,只能通过设置界面去设置,QQ、apus、edge也是这么做的
                //vivo也清除不掉com.vivo.browser
    //            if (TextUtils.isEmpty(packageName) || OPPO_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
    //                //说明是oppo的系统默认浏览器,暂时这里用可以通过网页来拉,
    //                return OPEN_PAGE_TYPE;
    //            } else {
    //                return OPEN_SETTINGS_TYPE;
    //            }
                return OPEN_SETTINGS_TYPE;
            } else if (SAMSUNG.equals(phoneType)) {
                if (TextUtils.isEmpty(packageName) || SAMSUNG_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
    //                //当三星返回android的时候,说明没有设置系统默认浏览器,这里用可以通过网页来拉
                    return OPEN_PAGE_TYPE;
                } else {
                    //这个地方也有可能误判,比如我们判断设置了QQ为默认浏览器(packageName == ***qq**),但是手机的确没有设置,但是这里不影响,因为可以通过设置界面设置。
                    return OPEN_SETTINGS_TYPE;
                }
            } else if (HUAWEI.equals(phoneType)) {
                int version = android.os.Build.VERSION.SDK_INT;
                if (version == Build.VERSION_CODES.O_MR1 || version == Build.VERSION_CODES.N || version == Build.VERSION_CODES.Q) {
                    if (TextUtils.isEmpty(packageName) || HUAWEI_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
                        return OPEN_PAGE_TYPE;
                    } else {
                        return OPEN_SETTINGS_TYPE;
                    }
                } else {
                    if (!HUAWEI_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
                        return OPEN_DELETE_FAULT_SETTINGS;
                    } else {
                        return OPEN_PAGE_TYPE;
                    }
                }
                //google暂时用拉的方式// 出现一个奇怪现象,就是虽然返回的包名是android没有设置,但是通过代码拉起网页进行选择的时候,那个框框拉不起来,导致最后检测还是android就是设置失败
            } else if (MEIZU.equals(phoneType)) {
                int version = android.os.Build.VERSION.SDK_INT;
                if (version == Build.VERSION_CODES.Q || version == Build.VERSION_CODES.P) {
                    return OPEN_SETTINGS_TYPE;
                } else {
                    if (TextUtils.isEmpty(packageName) || GOOGLE_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
                        return OPEN_PAGE_TYPE;
                    } else {
                        return OPEN_DELETE_FAULT_SETTINGS;
                    }
                }
            } else if (GOOGLE.equals(phoneType)) {
                if (TextUtils.isEmpty(packageName) || GOOGLE_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
                    return OPEN_PAGE_TYPE;
                } else {
                    return OPEN_DELETE_FAULT_SETTINGS;
                }
            } else {
                if (TextUtils.isEmpty(packageName) || GOOGLE_DEFAULT_BROWSER_PACKAGE.equals(packageName)) {
                    return OPEN_PAGE_TYPE;
                } else {
                    return OPEN_DELETE_FAULT_SETTINGS;
                }
            }
        }
    
        public static boolean isOppo() {
            String brand = Build.BRAND.toLowerCase();
            if ("oppo".equals(brand)) {
                return true;
            } else
                return false;
        }
    
        public static boolean isVivo() {
            String brand = Build.BRAND.toLowerCase();
            if ("vivo".equals(brand)) {
                return true;
            } else
                return false;
        }
    
        public static String getPhoneType() {
            String brand = Build.BRAND.toLowerCase();
            Log.i(TAG, "getPhoneType brand is:" + brand);
            switch (brand) {
                case "samsung":
                    return SAMSUNG;
                case "huawei":
                case "honor":
                    return HUAWEI;
                case "xiaomi":
                case "redmi":
                    return XIAOMI;
                case "vivo":
                    return VIVO;
                case "oppo":
                case "realme":
                    return OPPO;
                case "google":
                    return GOOGLE;
                case "meizu":
                    return MEIZU;
                default:
                    return OTHER;
            }
        }
    
        /**
         * 显示已安装应用程序的详细信息,如果是通过网页拉起的方式,但是有设置了其它app为默认浏览器的话,需要先把app 清除默认设置 去掉
          * @param context
         * @param packageName
         */
        public static void showInstalledAppDetails(Context context, String packageName) {
            Intent intent = new Intent();
            final int apiLevel = Build.VERSION.SDK_INT;
            if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts(SCHEME, packageName, null);
                intent.setData(uri);
            } else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
                    // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
                final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
                        : APP_PKG_NAME_21);
                intent.setAction(Intent.ACTION_VIEW);
                intent.setClassName(APP_DETAILS_PACKAGE_NAME,
                        APP_DETAILS_CLASS_NAME);
                intent.putExtra(appPkgName, packageName);
            }
            context.startActivity(intent);
        }
    
    
        /**
         * 得到当前已经 默认设置浏览器 app的包名
         * @param paramContext
         * @return
         */
        public static String getDefaultActivityPackageName(Context paramContext) {
            PackageManager pm = paramContext.getPackageManager();
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.google.com"));
            ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
            if (info != null && info.activityInfo != null) {
                Log.i(TAG, "getDefaultActivityPackageName info = " + info + ";pkgName = " + info.activityInfo.packageName);
                return info.activityInfo.packageName;
            } else {
                Log.i(TAG, "getDefaultActivityPackageName info = ''");
                return "";
            }
        }
    
    
        /**
         * 这是得到华为手机 哪些设置默认浏览器的app列表
         * @param paramContext
         * @return
         */
        public static ArrayList getDefaultBrowserList(Context paramContext) {
            getDefaultActivityPackageName(paramContext);
            ArrayList localArrayList1 = new ArrayList();
            PackageManager localPackageManager = paramContext.getPackageManager();
            Intent localIntent = new Intent("android.intent.action.VIEW");
            localIntent.addCategory("android.intent.category.BROWSABLE");
    //        localIntent.setData(Uri.parse("http://bbs.liebao.cn"));
            localIntent.setData(Uri.parse("http://www.baidu.com"));
            try {
                List localList2 = localPackageManager.queryIntentActivities(localIntent, 0);
                List localList1 = null;
                if (localList2 != null) {
                    Log.i(TAG, "localList2 size is " + localList2.size());
                } else {
                    Log.i(TAG, "localList2 == null");
                }
                localList1 = localList2;
                if (localList1 != null) {
                    ArrayList localArrayList2 = new ArrayList();
                    ArrayList localArrayList3 = new ArrayList();
                    Iterator localIterator1 = localList1.iterator();
                    while (localIterator1.hasNext()) {
                        ResolveInfo localResolveInfo = (ResolveInfo) localIterator1.next();
                        Log.i(TAG, "localResolveInfo.activityInfo.packageName is " + localResolveInfo.activityInfo.packageName);
                        localPackageManager.getPreferredActivities(localArrayList3, localArrayList2, localResolveInfo.activityInfo.packageName);
                        Log.i(TAG, "localArrayList2 size is:" + localArrayList2.size());
                        Log.i(TAG, "localArrayList3size is:" + localArrayList3.size());
                        Iterator localIterator2 = localArrayList3.iterator();
                        while (localIterator2.hasNext()) {
                            IntentFilter localIntentFilter = (IntentFilter) localIterator2.next();
                            if (((!localIntentFilter.hasCategory("android.intent.category.BROWSABLE")) && (!localIntentFilter.hasCategory("android.intent.category.DEFAULT"))) || (!localIntentFilter.hasDataScheme("http")))
                                continue;
                            localArrayList1.add(localResolveInfo);
                        }
                    }
                }
            } catch (Exception localException) {
                Log.i(TAG, "getDefaultBrowserList has error");
            }
            Log.i(TAG, "localArrayList1 size is:" + localArrayList1.size());
            return localArrayList1;
        }
    
    
    
        /**
         * 找到默认浏览器对应的包名
         * 有可能会设置多个浏览器为默认浏览器,这里只考虑其中一个
         */
        public static String findPackageNameOfDefaultBrowser(Context context) {
    //        String phoneType = getPhoneType();
    //        if (OPPO.equals(phoneType)) {
    //            String packageName = getDefaultActivityPackageName(context);
    //            return packageName;
    //        }
            Iterator iterator = getDefaultBrowserList(context).iterator();
            String result = "";
            if (iterator.hasNext()) {
                ResolveInfo resolveInfo = (
                        ResolveInfo) iterator.next();
                result = resolveInfo != null ? resolveInfo.activityInfo.packageName : "";
                Log.i(TAG, "has find findPackageNameOfDefaultBrowser is:" + result);
                return result;
            }
            Log.i(TAG, "has not find findPackageNameOfDefaultBrowser is:" + result);
            return result;
        }
    
    
        /**
         * 跳三星手机默认浏览器设置页面
         */
        public static void openSamsung(Activity context) {
            if (context == null) return;
            int version = android.os.Build.VERSION.SDK_INT;
            Intent intent = new Intent("/");
            ComponentName componentName;
            if (version >= Build.VERSION_CODES.Q) {
                componentName = new ComponentName("com.samsung.android.permissioncontroller", "com.android.packageinstaller.role.ui.DefaultAppListActivity");
            } else {
                componentName = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity");
            }
            intent.setComponent(componentName);
            context.startActivityForResult(intent, RESPONSE_CODE);
        }
    
        /**
         * 跳小米或者红米或者oppe手机默认浏览器设置页面
         */
        public static void openXiaomiOrOppo(Activity context) {
            if (context == null) return;
            ComponentName componentName;
            Intent intent = new Intent("/");
            componentName = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity");
            intent.setComponent(componentName);
            context.startActivityForResult(intent, RESPONSE_CODE);
        }
    
    
        public static void openMeizu(Activity context) {
            if (context == null) return;
            ComponentName componentName = null;
            Intent intent = new Intent("/");
            int version = android.os.Build.VERSION.SDK_INT;
            if (version == Build.VERSION_CODES.Q) {
                componentName = new ComponentName("com.android.permissioncontroller", "com.android.packageinstaller.role.ui.DefaultAppListActivity");
            } else if (version == Build.VERSION_CODES.P) {
                componentName = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity");
            } else {
                //android 5.1调用上面的会奔溃
            }
            intent.setComponent(componentName);
            context.startActivityForResult(intent, RESPONSE_CODE);
        }
    
        /**
         * 跳华为10.0
         *
         * @param context
         */
        public static void goHuawei(Activity context) {
            //com.android.permissioncontroller/com.android.packageinstaller.role.ui.DefaultAppListActivity
            if (context == null) return;
            int version = android.os.Build.VERSION.SDK_INT;
            if (version == Build.VERSION_CODES.Q) {
                ComponentName componentName;
                Intent intent = new Intent("/");
                componentName = new ComponentName("com.android.permissioncontroller", "com.android.packageinstaller.role.ui.DefaultAppListActivity");
                intent.setComponent(componentName);
                context.startActivityForResult(intent, RESPONSE_CODE);
            } else if (version == Build.VERSION_CODES.O_MR1 || version == Build.VERSION_CODES.N) {
                openXiaomiOrOppo(context);
            } else {
    
            }
        }
    
        /**
         * apuls oppo手机打开设置页面
         */
        public static final void openSetBrowserPage(Activity context) {
            if (context == null) return;
            //com.android.settings/.Settings$AdvancedAppsActivity
            Intent intent = new Intent("/");
            //apus oppo
    //        ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity")
            //qq oppo
    //        ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$ManageApplicationsActivity");
    
            //apus vivo
    //        ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity");
    
            //小米 com.android.settings/.Settings$AdvancedAppsActivity
            //红米 com.android.settings/.Settings$AdvancedAppsActivity
    
            //      google 10
            //      context: com.android.packageinstaller.role.ui.DefaultAppListActivity@c6d7370
            //      client: com.android.packageinstaller.role.ui.DefaultAppListActivity@c6d7370 (android.os.BinderProxy@af71233)
    
            //google 10 Android 10.0的google设备
            //Android10.0以下有网页拉,设置失败后,还是走正常路线,跳 应用详细页面然后再去清除,不是跳设置页面,上面的页面会奔溃
    //        ComponentName cn = new ComponentName("com.google.android.permissioncontroller", "com.android.packageinstaller.role.ui.DefaultAppListActivity");
    
            //sanxing 10.0的设备
            //com.samsung.android.permissioncontroller/com.android.packageinstaller.role.ui.DefaultAppListActivity
            //ComponentName cn = new ComponentName("com.samsung.android.permissioncontroller", "com.android.packageinstaller.role.ui.DefaultAppListActivity");
    
            //sanxing 9.0的设备
            //com.android.settings/.Settings$AdvancedAppsActivity
            ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$AdvancedAppsActivity");
            //com.meizu.settings.MzSettingsActivity$DefaultAppsActivity@2af4c15
            //meizu 9.0 //com.android.settings/com.meizu.settings.MzSettingsActivity$DefaultAppsActivity不奔溃,但是android6.0.1会奔溃,还是用网页拉吧
            //ComponentName cn = new ComponentName("com.android.settings", "com.meizu.settings.MzSettingsActivity$DefaultAppsActivity");
            //meizu10.0//com.android.permissioncontroller/com.android.packageinstaller.role.ui.DefaultAppListActivity
    
            intent.setComponent(cn);
            context.startActivityForResult(intent, RESPONSE_CODE);
        }
    
        /**
         * 通过包名得到apk名字
         *
         * @param context
         * @param packageName
         * @return
         */
        public static String getApplicationNameByPackageName(Context context, String packageName) {
            if (context == null) return "";
            PackageManager packageManager = context.getPackageManager();
            String name;
            try {
                name = packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString();
            } catch (PackageManager.NameNotFoundException e) {
                name = "";
            }
            return name;
        }
    
        public static boolean isOwnerPackageName(Context context, String packageName) {
            if (context == null || TextUtils.isEmpty(packageName)) {
                return false;
            }
            if (packageName.equals(context.getPackageName())) {
                return true;
            }
            return false;
        }
    
        /**
         * 判断当前设置自己app为默认浏览器 是不是已经成功
         * @param context
         * @return
         */
        public static boolean isSetOwnerSuccess(Context context) {
            if (context == null) return false;
            String packageName = "";
            packageName = getDefaultActivityPackageName(context);
            return isOwnerPackageName(context, packageName);
        }
    
    
        /**
         * 判断当前hw是不是是不是设置
         */
        public static boolean huaweiIsSetDefaultBrowserSuccess(Context context) {
            if (context == null) return false;
            String packageName = findPackageNameOfDefaultBrowser(context);
            if (TextUtils.isEmpty(packageName)) {
                return false;
            }
            if (packageName.equals(context.getPackageName())) {
                return true;
            }
            return false;
        }
    
        /**
         * 通过打开链接方式设置默认浏览器,如果是用户点击了自己的app打开这个链接,收到后需要单独处理,提示设置成功,可以参考QQ浏览器
         * @param context
         * @param url  这个参数是自己设置的url,如果通过打开链接方式是通过其它浏览器打开的话,就会直接在其它浏览器打开该链接,如果是
         *             自己的app打开,我们可以获取通过getIntent获取我们当前设置的值进行判断是不是设置成功了。
         */
        public static void setDefaultBrowserByLink(Context context, String url) {
            if (context == null) return;
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addCategory(Intent.CATEGORY_BROWSABLE);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            //这里可以携带值
            intent.putExtra("test", "test");
            context.startActivity(intent);
        }
    }
    

     

    展开全文
  • 不需要任何权限查看Chrome浏览器保存的密码 前言 如今我们为了方便,在浏览器中都保存了很多账号的密码,这样每次登录保存过的账号就不用输入密码了,但是方便的同时也存在着很多的问题。 通常,我们在Chrome...
  • 手机浏览器UA设置

    万次阅读 2012-08-10 15:42:22
    浏览器浏览网页时,浏览器会发送User Agent到网站服务器, 服务器可以根据User Agent识别用户的操作系统及版本,浏览器及版本. 然后判断用户浏览器可以支持的功能,从而返回给浏览器不同的代码, 但这种差异一般会很...
  • 用chrome浏览器做笔试时无法修改摄像头使用权限 秋招开始了,很多公司要求都使用chrome浏览器来进行笔试。前天笔试前发现浏览器摄像头无法获取。可能的原因有以下几种: 1.chrome浏览器设置了禁止使用麦克风和摄像头...
  • 关于onGeolocationPermissionsShowPrompt地理位置权限如何打开问题,有一下步骤解决: ①在AndroidManifest.xml里面声明权限: <uses-permission android:name="android.permi
  • h5获取浏览器的相机和摄像头权限

    千次阅读 2019-07-30 17:05:35
    检查浏览器是否支持getUserMedia方法: navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || ...
  • 今天上知乎看到有人在上邀请我回答这样一个问题:如果访问的页面中有 CSS3 代码,双核浏览器会自动切换到 Webkit 内核吗?http://www.zhihu.com/question/20094625 我的第一反应是:不会。目前我知道IE可以设置浏览...
  • 由于不同角色权限不同,显示的界面也就不同(功能与主题等),同浏览器同时登录不同角色会出现角色互串的问题,以下分析与解决均为同浏览器所在环境 分析 1、登录逻辑 用户输入登录信息,点击登录向服务端发起请求...
  • 各大浏览器免费观影权限的插件程序 现在好多人都喜欢追剧,尤其是一些时间久的,但是好多都需要vip才能观看,作为消费者来说,肯定想免费获得观看权限,所以博主分享一些浏览器插件(uc、2345、360、google、qq、...
  • 无法设置默认浏览器的解决办法

    万次阅读 2013-09-13 09:49:04
    问题描述:在某网站上下了一个工具安装包,完成后尽然...1.在Chrome设置界面中提示 “Google Chrome不能确定或设置默认浏览器。” 无法设置,此路不通。 2.有人说控制面板可以,打开控制面板,点击左侧的 “设置程序访
  • 设置和清除默认浏览器为例。 1、检查是否已经设置了默认 [java] view plaincopy private void testGetDefaultActivity() {   PackageManager pm = getPackageManager(); ...
  • 设置电脑默认浏览器的方法

    千次阅读 2017-11-30 14:09:17
    今天,工作忙完以后没什么事,然后就在想qq空间点击进入的时候都是默认IE打开,个人不喜欢IE浏览器,就想把他换为谷歌的...这篇文章介绍了如何设置默认浏览器的方法 具体是去 控制面板\程序\默认程序\设置默认程序 进
  • 在uni-app中如何配置权限 首先,我们先通过API了解,他对权限的需求,比如在上个帖子中 ===>>对APP后台静默更新升级对文件管理和文件下载权限的需求 当时我们使用了这个权限: android.permission.WRITE_...
  • chrome浏览器无法在root权限下启动
  • 文件上传浏览器限制设置

    千次阅读 2018-12-06 11:16:06
    需要在config文件设置httpRuntime 和 maxAllowedContentLength &lt;system.web&gt; &lt;httpRuntime targetFramework="4.6.1"  maxRequestLength="1048576000" ...
  • 谷歌浏览器安全权限问题 我们可以通过一下方式解决: 一、网页使用https方式访问 此操作需要依赖web提供者实现https的访问方式。 二、修改浏览器安全配置(最直接、简单) 1、浏览器地址栏输入: chrome://flags/#un
  • 关于XP系统下IE8总是提示设置默认浏览器的修改问题 出现此种情况,一般是由于操作IE的权限不足,无法保存用户的写入操作而造成的,解决办法如下: 1、开始【运行】输入“Regedit”打开注册表 2、依次定位至...
  • 我用的Win7系统,想用360浏览器,把360改成了默认浏览器后,就出现了一下问题:1、每一次第一次启动IE,总会弹出提示"是否设置IE为默认浏览器"的提示;除非选择"是"把IE作为默认浏览器,否则关闭IE后再重启,依然会弹...
  • 后端跨域权限无法打开,于是去网上找了下我这边能不能解决 现在的浏览器出于安全策略的限制,都是不允许跨域的,但是开发的时候经常需要...今天无意中知道了,chrome浏览器可以通过设置,解决跨域问题。 如果 Chrom
  • 4、这时候如果会提示需要管理员权限才能修改的话,继续下面的操作,如果没有提示,上面的就完成了 5、使用电脑的 win+R 键,打开命令行输入 gpupdate ,提示用户策略更新完成,再继续上面的操作就ok啦 ...
  • svn浏览器访问新的路径,在排除了用户权限问题之后,输入用户名密码还是无法登录。 解决办法是:清除已经保存的用户验证信息
  • 因为chromedriver默认弹框,设置他不弹窗就可以了 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(’–headless’) chrome_options.add_argument(’–no-sandbox’) driver = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,130
精华内容 121,652
关键字:

怎么设置浏览器权限