一句命令解决问题:

电脑端有adb的话

adb shell settings put global captive_portal_server g.cn

手机上操作的话需要有root,拿到手机的shell后

su

settings put global captive_portal_server g.cn

然后重启下手机

从此能正常使用的网络不会再跳出登录到XXX网络的烦人提示了,除了一些需要登录的免费热点

===============================================

2016年9月15日更新:

手机刷了Android 7.0 后发现此方法失效!7.0系统请移步:Android 7.X 去掉网络感叹号 

 

公司给配了一台Dell Inspiron  3558用于外出办公。由于工作需求又安装了Ubuntu 14.04,结果发现就触摸板没反应。为了能把触摸板用起来,找了很多方法都不奏效,最后在Google上找到这么个解决方案:

参考地址:http://askubuntu.com/questions/592925/dell-inspiron-3551-unresponsive-touchpad

主要思路是关闭i2c_hid并且在启动的时候加入nopnp参数(i2c_hid是啥我也没搞明白)

首先:sudo gedit /etc/default/grub

然后再gedit里面找到这么一行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

把它改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.nopnp"
保存后执行:
sudo update-grub
然后再运行这4条语句:

echo "blacklist i2c_hid" | sudo tee /etc/modprobe.d/i2c-hid.conf
sudo depmod -a
sudo update-initramfs -u
echo "synaptics_i2c" | sudo tee -a /etc/modules

重启,然后就能发现触摸板居然能用了!

再贴一下英文原文:

 

You can fix it by switching off i2c_hid and setting nopnp in boot parameters this way

  1. Run

sudo gedit /etc/default/grub

In the open window edit line

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

it should look this way

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.nopnp"

Save file and run

sudo update-grub
  1. Run
    echo "blacklist i2c_hid" | sudo tee /etc/modprobe.d/i2c-hid.conf
    sudo depmod -a
    sudo update-initramfs -u
    echo "synaptics_i2c" | sudo tee -a /etc/modules
    
  2. Reboot.

在Android5.0以前的版本中,可以通过简单的反射机制来直接控制手机网络的打开与关闭:

ConnectivityManager connectivityManager =
        (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Method setMobileDataEnabl;
try {
    setMobileDataEnabl = connectivityManager.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);
    setMobileDataEnabl.invoke(connectivityManager, pBoolean);
} catch (Exception e) {
    e.printStackTrace();
    Log.e("MobileUtil", "移动数据设置错误:" + e.toString());
}

但是,在Android5.0版本及以上,这方法就失效了,于是在StackOverFlow上面有大神提出一个解决方案,前提是手机必须能获取到Root权限:

private static void executeCommandViaSu(Context context, String option, String command) {
    boolean success = false;
    String su = "su";
    for (int i=0; i < 3; i++) {
        // Default "su" command executed successfully, then quit.
        if (success) {
            break;
        }
        // Else, execute other "su" commands.
        if (i == 1) {
            su = "/system/xbin/su";
        } else if (i == 2) {
            su = "/system/bin/su";
        }
        try {
            // Execute command as "su".
            Runtime.getRuntime().exec(new String[]{su, option, command});
        } catch (IOException e) {
            success = false;
            // Oops! Cannot execute `su` for some reason.
            // Log error here.
        } finally {
            success = true;
        }
    }
}
public static void setMobileNetworkfromLollipop(Context context,boolean ii) throws Exception {
    String command = null;
    int state=0;
    if(ii){
        state=1;
    }
    try {
        String transactionCode = getTransactionCode(context);
        // Android 5.1+ (API 22) and later.
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            SubscriptionManager mSubscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
            // Loop through the subscription list i.e. SIM list.
            for (int i = 0; i < mSubscriptionManager.getActiveSubscriptionInfoCountMax(); i++) {
                if (transactionCode != null && transactionCode.length() > 0) {
                    // Get the active subscription ID for a given SIM card.
                    int subscriptionId = mSubscriptionManager.getActiveSubscriptionInfoList().get(i).getSubscriptionId();
                    // Execute the command via `su` to turn off
                    // mobile network for a subscription service.
                    command = "service call phone " + transactionCode + " i32 " + subscriptionId + " i32 " + state;
                    executeCommandViaSu(context, "-c", command);
                }
            }
        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
            // Android 5.0 (API 21) only.
            if (transactionCode != null && transactionCode.length() > 0) {
                // Execute the command via `su` to turn off mobile network.
                command = "service call phone " + transactionCode + " i32 " + state;
                executeCommandViaSu(context, "-c", command);
            }
        }
    } catch(Exception e) {
        // Oops! Something went wrong, so we throw the exception here.
        throw e;
    }
}
private static String getTransactionCode(Context context) throws Exception {
    try {
        final TelephonyManager mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final Class<?> mTelephonyClass = Class.forName(mTelephonyManager.getClass().getName());
        final Method mTelephonyMethod = mTelephonyClass.getDeclaredMethod("getITelephony");
        mTelephonyMethod.setAccessible(true);
        final Object mTelephonyStub = mTelephonyMethod.invoke(mTelephonyManager);
        final Class<?> mTelephonyStubClass = Class.forName(mTelephonyStub.getClass().getName());
        final Class<?> mClass = mTelephonyStubClass.getDeclaringClass();
        final Field field = mClass.getDeclaredField("TRANSACTION_setDataEnabled");
        field.setAccessible(true);
        return String.valueOf(field.getInt(null));
    } catch (Exception e) {
        // The "TRANSACTION_setDataEnabled" field is not available,
        // or named differently in the current API level, so we throw
        // an exception and inform users that the method is not available.
        throw e;
    }
}

当代码中调用setMobileNetworkfromLollipop方法时,系统会提示应用要获取Root权限,其实这个方法的本质就是在Linux的终端中输入了svc data enable。。。 没有Root的机器是暂时没有解决办法的,因为只有root身份才能执行svc data enable。不知道这是不是Google故意把那个非公开api去掉了,不过回过头想想,不能直接使用这个方法也是为了考虑到系统的安全性,毕竟这个被滥用后会是一件非常麻烦的事 如果有别的方案可以开启数据连接的话欢迎提出来

最近从Eclipse转到Android Studio后,发现了不少的问题,其中一个让人头疼的问题是不能用AS来Debug,这一点是无法让我接受的。趁着周末有空就研究一下这个问题。

调试用的手机是小米3电信/联通版,AS版本是1.3.2 build 141.2178183,具体的问题如下:

QQ20150927213926

AS中点击Debug选择设备后就卡在了这里:Waiting for process:

相应的,手机上则卡在了这个界面:

Screenshot_com.example.luci.myapplication_2015-09-27-21-40-39

只是偶尔一两次可以进行Debug,如果点击Run则一点问题都没有。Oh no!

起初怀疑是手机问题,但是很快就被我否定了,因为之前用Eclipse调试的时候没出现过这种问题,而且手机插在别的有AS的电脑上也没出现这种问题。

于是怀疑是电脑问题,为此我特意准备了一个虚拟机,安装同样的操作系统,用同样的软件搭建同样的编程环境,却发现在虚拟机中一切正常,能正常调试!看来是电脑的问题了

然后开始怀疑驱动,由于之前用的是刷机精灵的驱动,于是我把驱动删了,换上了国外的某个软件下载的驱动,尝试后发现不行。删除驱动后我下载了我最反感的360,让这货给我装驱动。结果这个360驱动居然也不行。。。

百思不得其解后,百度找了下,找到一篇帖子提到了这个问题。按照帖子里讲的,禁用MDB设备,结果无效。。。到此我心想,换台手机试试呢?于是我找出了N年前的一台2.3.5系统的手机插上去后居然能正常调试,非常好使,至此我开始迷糊了。。。

在Goodle上找了一会儿,就找到一个StackOverflow上说项目的设置问题,把android:debug去掉即可。但是我在我的项目中压根就没看见有过这个属性,所以排除之。

结束语:折腾了一天结果还是没搞明白到底是什么原因,我也不想上论坛发帖子去问,因为这种帖子一发就铁定石沉大海了,就算有人回复那也是以灌水回复捞积分的居多。说句实话,百度知道上面真正懂技术的人是少之又少,大部分问题的回答都是牛头不对马嘴,完全不看问题问的是什么就在那边乱回答,参考意义实在是不大

操作环境:Win8.1企业版+VMWare WorkStation 12 Pro

电脑系统重装后,神马驱动都没了,包括adb的。现在做开发需要安装adb驱动,但是又不想在自己的电脑上安装那些360手机助手等等奇葩流氓软件,于是在虚拟机里面操作安装了adb驱动(死也是死个虚拟机而已)。问题来了,如何把这个驱动从虚拟机里面捞出来呢?现在知道的是驱动肯定在Windows文件夹中,为了方便,直接把Windows文件夹捞出来

尝试1:VMWare 有映射虚拟磁盘的功能,能轻松的把虚拟磁盘映射到主机中。

QQ20150927100732

但是!这有个问题。。。虽然磁盘映射成功了,在Windows资源管理器中能看见这个盘,但在Windows磁盘管理中却看不见这个盘;同理更新驱动的时候都提示位置不存在:

QQ20150927101109

QQ20150927101309

坑爹啊!

那么既然Windows资源管理器里面能看见它,就直接复制出来吧!

提示要提供权限

QQ20150927101513

然后,奇怪的一幕再次发生:

QQ20150927101618

MD居然说位置不可用!微软这是傻逼了吗???

右键修改文件夹属性:

QQ20150927101954

权限也改不了,真是哔了狗了。。。

换个思路:右键以管理员身份运行VMWare,这个主意看上去不错

QQ20150927102300

点击确定后,弹了一个对话框(大概是讲什么快照啊什么问题),再点了下确定

QQ20150927102444

还是位置不可用!这回在windows资源管理器里面都看不见了!

到此为止,这条路走不通。。。

尝试2:以前玩过M$的vhd,这种类型的盘挂载后能在Windows资源管理器里面显示,磁盘管理里面也能处理。google了一下找到这么个软件

QQ20150927102755

能把vmdk转成vhd。。。(不得不赞叹现在的软件真强大)

QQ20150927102929

双击转换完成后的vhd文件直接挂载,这次挂载在H盘

然后更新驱动程序:

QQ20150927103108

成功读取到了!

写到这里,基本上是实现我的想法了。虽然最后还是驱动安装失败,至少是发现了VMware的这个缺点,以后能少走弯路。。。

之前写过一篇安装破解的教程,可惜随着虚拟主机的倒闭一起没了。正好最近需要用到ps,于是乎重新写一下这份教程。

首先运行安装程序

咦你可能会看到这个

首次运行

请直接无视之

解压中:

解压中

解压后就会跳出安装选项

安装界面

我觉得这里应该先点击试用,如果先点击输入序列号的话有可能安装好之后不是Extend版本(本人有强迫症,哈哈)

然后就是长篇大论的软件许可协议,你不接受都不行。。。

PS协议

在点击那个接受按钮前,请先把网络断开(拔掉网线,拔掉无线网卡或者直接禁用),如果不断开网络的话就会跳出要你登录Adobe账号的界面(我想一般人不会去弄这个账号的吧- -)

登录Adobe账号

如果断开网络的话,则会跳出这个界面:

安装选项

选择功能,选择安装位置后点击安装,然后就耐心的等吧~(电脑是64位的话会有图上的两个选项,如果是32位则只有一个选项)

安装中

安装完成

安装完成

接下来就是重点,如何破解啦!

破解前请先运行一次,然后关闭,复制破解补丁替换安装目录下的同名文件,然后再运行,就可以看见变成了Extend版了~为啥我这里不上图呢,是因为我直接把破解补丁替换进去后再启动程序,结果不是Extend版。。。。

对于android 3.0以下 的系统,使用Notification.Builder来创建通知;android3.0以上的系统,推荐使用NotificationCompat.Builder,当然也能使用Notification.Builder,这个NotificationCompat在v4包中。不推荐直接使用Notification来创建通知。

首先要获取NotificationManager:(这个无论什么版本的系统都是需要的)

NotificationManager nm = (NotificationManager)mContext.getSystemService(NOTIFICATION_SERVICE);

接下来就是创建一个通知

3.0以上系统写法:

NotificationCompat.Builder mBuilder;

mBuilder = new NotificationCompat.Builder(mContext);

3.0以下的写法:

Notification.Builder mBuilder;

mBuilder = new Notification.Builder(mContext);

其实写法都是大同小异的

有几个常用的设置属性的方法:

setContentTitle(String title) //设置通知的标题

setContentText(String content) //设置通知的内容

setTicker(String ticker)//设置通知出现的的时候显示在顶部/底部通知栏的提示消息

setSmallIcon(int resIcon)//设置通知的图标(经测试,此项必选,否则通知将不显示

setWhen(System.currentTimeMillis())//设置发送通知的时间为当前时间

setContentIntent(Intent contentIntent)//设置点击通知的时候要发送的pendingIntent

setAutoCancel(boolean cancelable)//设置通知是否能被清除

setProgress(int max,int progress,boolean indeterminate)//如果设置这个属性的话通知中就会显示一个进度条,进度值为progress,最大值为max

设置完毕后调用build()即可创建通知,该方法将返回一个Notification的实例

通知创建出来后需要通过NotificationManager来发送:

notify(int uniqueId,Notification notification);//uniqueId是全app的一个唯一id值,如果要清除或者更新这个通知的话需要将uniqueId设置为相同的值

如果要清除这个通知,调用这个方法:

cancel(int uniqueId);

(2015年8月8日补充)

其实在平时的开发中,为了能兼容低版本的系统,同时又为了减少代码中对版本号的判断,可以考虑直接使用NotificationCompat.Builder,因为这个可以说是通用的

共用函数

private void Swap(int left, int right)
{
int temp;
temp = left;
left = right;
right =temp;
}

基本冒泡排序

基本冒泡排序的最好、最坏、平均情况下的时间复杂度都为O(n^2)。故算法的平均时间复杂度也为O(n^2)。

算法如下:
///     冒泡排序的过程很简单,首先将第一个记录的关键字与第
///     二个记录的关键字进行比较,若按升序排序,则当第一个记录的
///     关键字大于第二个记录的关键字时,将两个记录交换。然后再比
///     较第二个记录和第三个记录的关键字。依次类推,直至第n-1个
///     记录和第n个记录的关键字进行比较为止。通过这样的一趟冒
///     泡排序,结果使得关键字最大的记录被安置在最后一个记录的位
///     置上,即它的最终位置。接着进行第二趟冒泡排序,对前n-1个
///     记录进行同样的操作,其结果是使关键字次大的记录被安置到
///     倒数第二个位置上。这样,通过n一1趟冒泡排序,就将n-1个记
///     录安置到相应的最终位置上,剩下的关键字最小的记录就放在
///     第一个位置,从而实现了升序排序。

public void BasicBubble(int [] myArray)
{
for(int i = 0; i < myArray.Length – 1; i++)//循环的趟数
{
for(int j = 0; j < myArray.Length – 1 – i; j++)//每趟循环的次数
{
if( myArray[j] > myArray[j+1] )
{
Swap(myArray[i], myArray[i+1]);
}
}
}
}

第一种改进:不做无用功

  这种算法最好的时间复杂度为O(n)。平均,最坏时刻复杂度为O(n^2)。

算法如下:
/// 设置一个标志位,当没有交换的时候这个标志位不会变化,那么说明数据已经
/// 排序好了,就不需要再进行剩余的循环。只有在标志位被重新设置的情况下才会
/// 进行剩余的循环。

public static void ImproveBubble1(int [] myArray)
{
bool isSorted = false;

for(int i = 0; i < myArray.Length – 1 && !isSorted; i++)//只有在没有排序的情况下才继续循环
{
isSorted = true; //设定排序标志
for(int j = 0; j < myArray.Length – 1 – i; j++)
{
if( myArray[j] > myArray[j+1] )
{
isSorted = false; //如果是没有排序,就重新设定标志
Swap(myArray[i], myArray[i+1]);
}
}
}
}

第二种改进:记录犯罪现场

  算法2最好的时间复杂度为O(n)。平均,最坏时刻复杂度为O(n^2)。

算法如下:
///     在冒泡排序中,每趟排序实现了将最大(升序)或
///     最小(降序)的记录安置到未排序部分的最后位置,即最终位置。
///     通过进一步观察研究,由于每趟排序过程中,通过和邻记录关键字两两
///     比较,大(升序)或小(降序)的记录在不断地往下沉或往后靠,
///     小(升序)或大(降序)的记录在不断往上冒或往前靠。
///     每经过一趟排序,在最后次交换位置后而的记录都已经排好序。根据
///     上面的思路,对n个记录进行第k趟排序,首先需在第k-1趟排
///     序时记下最后交换的位置。然后在第k趟排序时,将第一个记
///     录的关键字与第二个记录的关键字进行比较,符合交换条件时,
///     进行交换。再比较第二个记录和第三个记录的关键字,依次类
///     推,直至第m-1个记录和第m个记录的关键字进行比较,而不
///     需要比较至n-k-1个记录。在大部分排序中,m都小于n-k-1
///     从而减少了比较趟数和每趟的比较次数。由于在第一趟排序时,
///     没有上一趟排序的m值。因此,还要设置m的初始值为n-1。

public static void ImproveBubble2(int[] myArray)
{
int m = myArray.Length – 1;
int k, j;

while( m > 0 )
{
for( k=j=0; j<m; j++)
{
if( myArray[j] > myArray[j+1])
{
Swap(myArray[j], smyArray[j+1]);
k = j; //记录每次交换的位置
}
}
m = k; //记录最后一个交换的位置
}
}

第三种改进:双向扫描,一网打尽

  算法最好的时间复杂度为O(n),最坏时刻复杂度为O(n^2)。

算法如下:
///  对n个记录进行排序时,设up记录了从前面向后面依次进行扫描时最后的交换位置,
///  low记录了从后面向前面依次进行扫描时最前的交换位置。
///  由上个改进的冒泡排序的原理可知,up后面的记录和low前面的记录都已有序。
///  每趟排序都由两次不同方向的比较、交换组成。第一次是从未排好序的第一个记录开始,
///  即从low记录开始,向后依次两两比较,如果不符合条件,则交换之,
///  直至比较到未排好序的最后一个记录,即up记录为止。
///  同时记下最后一次交换的位置,并存于up。第二次是从未排好序的最后一个记录开始,
///  即从up记录开始,向前依次两两比较,如果不符合条件,则交换之,
///  直至比较到未排好序的第一个记录,即low记录为止。同时记下最后次交换的位置,
///  并存于low. 这样,就完成了一趟排序。
///  每趟排序都实现了将未排好序部分的关键字大的记录往后移(升序),
///  关键字小的记录往前移(升序),从而使两端已排好序(如果是降序,记录移动的方向则相反)。
///  未排好序部分的记录的首尾位置分别由low和up指明。
///  不断按上面的方法进行排序,使两端已排好序的记录不断增多,
///  未排好序部分的记录逐渐减少。即low和up的值不断接近,当low>=up时,
///  表明已没有未排好序的记录,排序就完成了。由于在第一趟排序时,
///  没有上趟排序的low和up值。因此,还要设置low和up的初始值分别为0和n-1。

public static void ImproveBubble3(int [] myArray)
{
int low, up, index, i;
low = 0;
up = myArray.Length – 1;
index = low;

while( up > low)
{
for( i=low; i<up; i++)  //从上向下扫描
{
if(myArray[i]>myArray[i+1])
{
Swap(ref myArray[i], ref myArray[i+1]);
index = i;
}
}

up = index; //记录最后一个交换的位置
for(i=up; i>low; i–)  //从最后一个交换位置处从下向上扫描
{
if(myArray[i]<myArray[i-1])
{
Swap(ref myArray[i], ref myArray[i-1]);
index = i;
}
}
low = index;  //记录最后一个交换的位置
}
}

由于安装的时候忘了截图,于是只能盗用别人的图了,原作者看到后别打我啊TAT

注:安装3DS Max 2014之前要求安装Microsoft .NET Framework 4.0(注意:这是成功安装的必须前提条件)

运行安装程序:

启动界面

接着有可能会看到这个界面(看不到那就算了)

选择驱动

 

安装界面

安装序列号:359-35184381;666-69696969 或 667-98989898、400-45454545    产品密钥:128f1

输入序列号

3DS Max 2014安装完成后,桌面的快捷方式默认启动的是英文版,为了方便在Windows的开始菜单-所有程序-Autodesk-Autodesk 3ds Max 2014下找到3ds Max 2014 – Simplified Chinese,点击它启动的便是中文版,启动过以后就默认为中文版。(在点击之前请先断开网络连接)

开始菜单选择中文版

 

在破解前一定要断开网络,然后启动3ds Max 2014会弹出激活的对话框,会要求你注册这是根据提示随意注册就行,接着在激活的对话框内按下列图示操作:

提示激活界面

请务必以管理员的身份打开注册机,然后按照下面两张图操作:

注册1

 

粘贴激活码以后一定要记住先点击注册机的“Patch”按钮!

注册2

注册机弹出下列对话框时按“确定”,接着才可以点击3ds Max 激活对话框的“下一步”

注册3

激活成功!

激活成功

 

问:使用UltraISO制作光盘映像文件时,选项“启用ISO文件卷过滤器”是什么意思,选择与否有什么区别?
答:关于“ISO文件卷过滤器”的说明:

1)ISO文件卷过滤器的作用只是去掉尾部的空白数据而已。

2)有些光盘加密程序会在尾部隐藏加密信息,这些信息位于ISO文件卷之外,因此启用“ISO文件卷过滤器”会出现问题。这时切忌启用“ISO文件过滤器”。否则无法正常制作镜像,或制作的镜像可能无法使用。这也是UltraISO单独设置这个选项的道理。

3)几乎所有刻录软件在将ISO镜像刻录到CD-R上时会添加空白数据(Padding Blocks),目的是提高光盘的访问性能。否则有些老光驱在定位最外边的扇区时可能有问题。

4)Windows资源管理器通过ISO文件卷的目录信息,直接访问文件数据。尾部的空白数据不会对光盘的使用造成任何影响。

5)因此几乎所有的镜像制作软件,包括Nero,CloneCD,Alcohol 102%均采用“忠实原盘”的方式制作ISO。这样既不影响使用,也不会遗漏任何有用数据。

6)UltraISO的“ISO文件卷过滤器”对使用MD5校验有所帮助。如果ISO文件为标准数据镜像,可以用WinMD5软件提取MD5校验码;刻录 后,用UltraISO+ISO过滤器可制作大小相同的镜像,方便进行MD5校验。不过这种方法比较繁琐。建议用UltraISO的”检查CD/DVD光 盘”功能,先计算ISO的MD5码,然后直接计算光盘的MD5码,可直接比较。在此项功能,ISO过滤器缺省打开,因此不会包含光盘尾部的空白扇区。

关于UltraISO提供“ISO文件卷过滤器”的好处:

1)在制作镜像文件时采用“忠实原盘”的方式,同时提供“ISO文件卷过滤器”选项。
一般情况下,不启用“ISO文件卷过滤器”,确保制作的镜像不会丢失重要信息。
如果是标准数据光盘,启用“ISO文件卷过滤器”,可得到大小与原ISO一样的镜像文件,便于检查。

2)在检查光盘/ISO文件时,自动启用“ISO文件卷过滤器”,从而避免因刻录软件添加Padding Blocks而造成的差异。