android开发 Activity设置模拟对话框效果
来先看下效果,有个感性的认识。
中间那个提示其实是一个activity,好的,下面开始一步步实现这个神奇的效果。
第一步:设计对话框页面activity_simulate_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center_horizontal" android:background="#ffffff" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="vertical" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提示" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确认购买该场次电影票吗?" /> <LinearLayout android:layout_width="200dp" android:layout_height="80dp" android:gravity="center" android:orientation="horizontal" > <Button android:id="@+id/btn_cancel" android:layout_width="100dp" android:layout_height="40dp" android:text="取消" /> <Button android:id="@+id/btn_confirm" android:layout_width="100dp" android:layout_height="40dp" android:text="确认" /> </LinearLayout> </LinearLayout> </RelativeLayout>
第二步:编写弹出窗Activity SimulateDialogActivity.java
ackage com.figo.study; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class SimulateDialogActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_simulate_dialog); Button btn_cancel = (Button) findViewById(R.id.btn_cancel); btn_cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); Button btn_confirm = (Button) findViewById(R.id.btn_confirm); btn_confirm.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } //点击外部区域关闭该activity @Override public boolean onTouchEvent(MotionEvent event) { finish(); return true; } }
第三步:style.xml设计style
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowNoTitle">true</item> <item name="android:windowAnimationStyle">@style/Anim_scale</item> </style> <style name="Anim_scale" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/scale_in</item> <item name="android:activityOpenExitAnimation">@anim/scale_out</item> <item name="android:activityCloseEnterAnimation">@anim/scale_in</item> <item name="android:activityCloseExitAnimation">@anim/scale_out</item>
第四步:anim文件夹设计动画
页面进入动画scale_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fromXScale="1.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" android:duration="200" android:pivotX="0" android:pivotY="10%" /> </set>
面退出动画scale_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fromXScale="1.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXScale="1.0" android:fromYScale="1.0" android:toYScale="0.0" android:duration="200" android:pivotX="0" android:pivotY="10%" /> </set>
第五步:关键一步,在AndroidManifest.xml注册模拟对话框Activity
<activity android:name="com.figo.study.SimulateDialogActivity" android:label="@string/app_name" android:theme="@style/SimulateDialog" > </activity>
第六步:调用对话框Activity
Button btnDialog = (Button) findViewById(R.id.btn_dialog); btnDialog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(TestActivity.this, SimulateDialogActivity.class); startActivity(intent); } });
将Android Activity设置成对话框式
将activity设置成对话框样式,只需在activity属性里面增加下面一句代码:
android:theme="@android:style/Theme.Dialog"
然后可以activity左边增加一个小图片,让它更像Dialog,代码如下:
package com.home.testactivitydialog; import android.os.Bundle; import android.view.Window; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_LEFT_ICON); setTitle("测试对话框式activity");// 设置标题 setContentView(R.layout.main);// 设置布局内容 // 设置左边图标 getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, android.R.drawable.ic_dialog_alert); } }
但是上面的设置往往还不能满足实际需求,因为样子、背景和一些属性使用的默认的,下面使用style自定义一个,以后可以根据实际需要自行更改:
<style name="dialog" parent="@android:style/Theme.Dialog"> <!-- 去黑边 --> <item name="android:windowFrame">@null</item> <!-- 设置是否可滑动 --> <item name="android:windowIsFloating">true</item> <!-- 设置是否透明 --> <item name="android:windowIsTranslucent">true</item> <!-- 无标题 --> <item name="android:windowNoTitle">true</item> <!-- 背景 --> <item name="android:background">@null</item> <!-- 窗口背景 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 是否变暗 --> <item name="android:backgroundDimEnabled">false</item> <!-- 点击空白部分activity不消失 --> <item name="android:windowCloseOnTouchOutside">false</item> </style>
这样在主题里直接引用:
android:theme="@style/dialog"
点击activity空白处不消失也可以代码里面设置,在onCreate()方法里面加上:
setFinishOnTouchOutside(false);
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Activity生命周期
安卓活动由一个返回栈管理
安卓活动有四个状态
1.运行状态
当一个活动位于栈顶的时候,这个活动就处于运行状态,也就是和用户进行交互的那个界面。
2.暂停状态
当活动不处于栈顶,但依然可见。意思就是这个活动没有被完全覆盖,上面有一层对话框之类的。
3.停止状态
活动不处于栈顶,完全不可见。这个好理解吧,就是用户看不到了。
4.销毁状态
活动从栈中移除了,也就是被用户关闭了。
Activity共有七个回调方法,覆盖了活动整个生命周期
1.onCreate()
活动创建时调用,一般被用来初始化。
2.onStart()
由不可见重新可见的时候调用。
3.onResume()
当活动到达栈顶的时候调用,也就是活动准备和用户交互的时候调用
4.onPause()
启动或者恢复另一个活动的时候调用。
5.onStop()
当活动完全不可见的时候会执行,注意是完全不可见,若是是启动一个对话框形式的活动,则不会启动。
6.onDestroy()
当活动被销毁之前调用
7.onRestart()
当活动由停止状态变为运行状态之前调用
下图很直观的表示了活动的生命周期
你可以用如下示例代码 仔细探索一下 通过logcat打印的内容 你能很容易的弄明白
public class MainActivity extends Activity { public static final String TAG="MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); Log.d(TAG,this.toString()); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if(savedInstanceState!=null) { String temp=savedInstanceState.getString("data_key"); Log.d(TAG,temp); } Button startNormal=(Button)findViewById(R.id.start_normal_activity); Button startDialog=(Button)findViewById(R.id.start_dialog_activity); startNormal.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,NormalActivity.class); startActivity(intent); } }); startDialog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,DialogActivity.class); startActivity(intent); } }); } @Override public void onStart(){ super.onStart(); Log.d(TAG,"onStart"); } @Override public void onResume(){ super.onResume(); Log.d(TAG,"onResume"); } @Override public void onPause(){ super.onPause(); Log.d(TAG,"onPause"); } @Override public void onStop(){ super.onStop(); Log.d(TAG,"onStop"); } @Override public void onDestroy(){ super.onDestroy(); Log.d(TAG,"onDestroy"); } @Override public void onRestart(){ super.onRestart(); Log.d(TAG,"onRestart"); }
关于启动模式
activity的启动也共有四种
要修改activity的启动模式,需要在AndroidManifest.xml中修改activity标签下的 android:launchMode
<activity android:name=".MainActivity" android:launchMode="singleTop" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
1.standard
这是活动的默认启动模式 ,这种启动模式,每次启动都会在栈中新建一个该活动的实例
好比在FirstActivity的基础上再启动一个FirstActivity 如果你要返回的话你就要按两次返回键才能返回到桌面
2.singleTop
这种模式很好的解决了上一种模式的问题
如果FirstActivity这个活动已经在栈顶了 那么如果你要再启动FirstActivity 是不会再创建新的实例了的
但是这种方法仅限于FirstActivity在栈顶的情况,如果FirstActivity不在栈顶,也就是不在用户能看到的界面,那么还是会创建新的实例。
3.singleTask
singleTask完美解决创建重复活动实例的情况。每次启动活动,它会自动查找栈中是否存在该活动的实例,若存在直接使用,不存在才创建
4.singleInstance
这个比较特殊,它启动活动时,会新建一个栈来存放新启动的活动。这种模式可以解决不同应用程序之间调用活动的问题。
Android客户端利用Socket连接服务器的大概思路如下:
客户端首次连接服务器:
socket = new Socket(); SocketAddress address = new InetSocketAddress(svrHost, svrPort); socket.connect(address, TIME_OUT); socket.setSoTimeout(TIME_OUT); in = new BufferedReader(new InputStreamReader( socket.getInputStream())); out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true);
连接服务器之后,调用注册或者登录,获取连接的token。 以后每次的连接获取信息都要带上约定的token。
连接建立以后,socket不必关闭,毕竟每次connect也浪费资源,可以一直挂住等待服务端的推送或者心跳等消息。
while (!exitSocket) { try { if (!socket.isClosed() && socket.isConnected() && !socket.isInputShutdown()) { char[] lenBuffer = new char[13]; int len = 0; try { len = in.read(lenBuffer); } catch (Exception e) { Utils.debug("SocketSvr socket read timeout"); stopSocketByException(true); }
每次的请求,server端返回的数据都包含在lenBuffer中,一般是约定好的json或者是其他格式的信息。
整体思路是和TCP是一样的,更多的问题出现在细节处理上和socket的生命周期的维护上。
比如如果断网或者出现异常导致socket出现exception,这时可能需要把当前的socket关闭(timeoutException应该不需要重启),然后重新启动新的socket,但是对于终端用户来说,应当避免的是让用户感觉到有界面的异动,需要立即重新连接server。
Android客户端通过socket与服务器通信实例
由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI代码不一样。
Android客户端通过socket与服务器通信分为下面5步:
(1)通过IP地址和端口实例化Socket,请求连接服务器;
socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321
(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。
(3)对Socket进行读写
out.println(message);
(4)关闭打开的流
out.close();
完整工程代码如下:
package com.yarin.android.Examples_08_04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Activity01 extends Activity { private final String DEBUG_TAG = "Activity01"; private TextView mTextView = null; private EditText mEditText = null; private Button mButton = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button)findViewById(R.id.Button01); mTextView = (TextView)findViewById(R.id.TextView01); mEditText = (EditText)findViewById(R.id.EditText01); //登陆 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { Socket socket = null; String message = mEditText.getText().toString() + "/r/n"; try { //创建Socket // socket = new Socket("192.168.1.110",54321); socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321 //向服务器发送消息 PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); out.println(message); //接收来自服务器的消息 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String msg = br.readLine(); if ( msg != null ) { mTextView.setText(msg); } else { mTextView.setText("数据错误!"); } //关闭流 out.close(); br.close(); //关闭Socket socket.close(); } catch (Exception e) { // TODO: handle exception Log.e(DEBUG_TAG, e.toString()); } } }); } }
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="这里显示接收到服务器发来的信息" /> <EditText android:id="@+id/EditText01" android:text="输入要发送的内容" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="发送" /> </LinearLayout>
AndroidManifest.xml文件如下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yarin.android.Examples_08_04" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Activity01" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-sdk android:minSdkVersion="5" /> </manifest>
当然,还有服务器端得代码
package com.yarin.android.Examples_08_04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server implements Runnable { public void run() { try { //创建ServerSocket ServerSocket serverSocket = new ServerSocket(54321); while (true) { //接受客户端请求 Socket client = serverSocket.accept(); System.out.println("accept"); try { //接收客户端消息 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String str = in.readLine(); System.out.println("read:" + str); //向服务器发送消息 PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true); out.println("server message"); //关闭流 out.close(); in.close(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { //关闭 client.close(); System.out.println("close"); } } } catch (Exception e) { System.out.println(e.getMessage()); } } //main函数,开启服务器 public static void main(String a[]) { Thread desktopServerThread = new Thread(new Server()); desktopServerThread.start(); } }
先开启服务器代码,
java Server即可
然后启动android模拟器。运行结果
这是Android客户端。输入12345,点击发送:
这是服务器端收到的消息
如果我们的android应用程序在按键的时候想调用系统的震动服务,我们得先再AndroidMainfest.xml里面加上相应的权限
<uses-permission android:name="android.permission.VIBRATE" />
然后就是
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
// vibrator.vibrate(3000);
// 设置Vibrate的震动周期
vibrator.vibrate(new long[]{1000,2000,3000,4000}, 0);
这里再网上找了个写好的震动的方法类
package com.lxb.switchdemo; import android.app.Activity; import android.app.Service; import android.os.Vibrator; import android.widget.LinearLayout; /** * 手机震动工具类 * * @author Administrator * */ public class VibratorUtil { /** * final Activity activity :调用该方法的Activity实例 long milliseconds :震动的时长,单位是毫秒 * long[] pattern :自定义震动模式 。数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长。。。]时长的单位是毫秒 * boolean isRepeat : 是否反复震动,如果是true,反复震动,如果是false,只震动一次 */ public static void Vibrate(final Activity activity, long milliseconds) { Vibrator vib = (Vibrator) activity .getSystemService(Service.VIBRATOR_SERVICE); vib.vibrate(milliseconds); } public static void Vibrate(final Activity activity, long[] pattern, boolean isRepeat) { Vibrator vib = (Vibrator) activity .getSystemService(Service.VIBRATOR_SERVICE); vib.vibrate(pattern, isRepeat ? 1 : -1); } }
当然在你的activity里面调用的时候只需要在onclick下加上
VibratorUtil.Vibrate(Switch_demoActivity.this, 100);
即可实现简单的震动机制
下来总结下按键声音的机制实现,
public class MainActivity extends Activity { private Button mButton01; private SoundPool sp;//声明一个SoundPool private int music;//定义一个整型用load();来设置suondID @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton01=(Button)findViewById(R.id.mButton01); sp= new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);//第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量 music = sp.load(this, R.raw.start, 1); //把你的声音素材放到res/raw里,第2个参数即为资源文件,第3个为音乐的优先级 mButton01.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { sp.play(music, 1, 1, 0, 0, 1); } } } }
raw是在res下面新建文件夹,里面都是不需要编译的可以直接用的资源文件,当然为了避免在有的机器里面不能识别按键声音的问日,最好把需要加载的音频格式转换成ogg格式。
android获取wifi外网ip的方法
// 获取外网IP public static String GetNetIp() { URL infoUrl = null; InputStream inStream = null; try { // http://iframe.ip138.com/ic.asp // infoUrl = new URL("http://city.ip138.com/city0.asp"); infoUrl = new URL("http://ip38.com"); URLConnection connection = infoUrl.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection) connection; int responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { inStream = httpConnection.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(inStream, "utf-8")); StringBuilder strber = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) strber.append(line + "\n"); inStream.close(); // 从反馈的结果中提取出IP地址 // int start = strber.indexOf("["); // Log.d("zph", "" + start); // int end = strber.indexOf("]", start + 1); // Log.d("zph", "" + end); line = strber.substring(378, 395); line.replaceAll(" ", ""); return line; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
另有一个获取外网IP的高端方法
public static String GetNetIp() { String IP = ""; try { String address = "http://ip.taobao.com/service/getIpInfo2.php?ip=myip"; URL url = new URL(address); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setUseCaches(false); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream in = connection.getInputStream(); // 将流转化为字符串 BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String tmpString = ""; StringBuilder retJSON = new StringBuilder(); while ((tmpString = reader.readLine()) != null) { retJSON.append(tmpString + "\n"); } JSONObject jsonObject = new JSONObject(retJSON.toString()); String code = jsonObject.getString("code"); if (code.equals("0")) { JSONObject data = jsonObject.getJSONObject("data"); IP = data.getString("ip") + "(" + data.getString("country") + data.getString("area") + "区" + data.getString("region") + data.getString("city") + data.getString("isp") + ")"; Log.e("提示", "您的IP地址是:" + IP); } else { IP = ""; Log.e("提示", "IP接口异常,无法获取IP地址!"); } } else { IP = ""; Log.e("提示", "网络连接异常,无法获取IP地址!"); } } catch (Exception e) { IP = ""; Log.e("提示", "获取IP地址时出现异常,异常信息是:" + e.toString()); } return IP; }
Android 获取wifi的IP地址
WifiManager wifimanage=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);//获取WifiManager //检查wifi是否开启 if(!wifimanage.isWifiEnabled()) { wifimanage.setWifiEnabled(true); } WifiInfo wifiinfo= wifimanage.getConnectionInfo(); String ip=intToIp(wifiinfo.getIpAddress()); //将获取的int转为真正的ip地址,参考的网上的,修改了下 private String intToIp(int i) { return (i & 0xFF)+ "." + ((i >> 8 ) & 0xFF)? + "." + ((i >> 16 ) & 0xFF) +"."+((i >> 24 ) & 0xFF ); }
OK,这样就好了吗?呵呵,别忘记加上权限
<uses -permission="" android:name="android.permission.ACCESS_WIFI_STATE"></uses> <uses -permission="" android:name="adnroid.permission.CHANGE_WIFI_STATE"></use
android开发 获取WIFI和有线的IP地址
首先设置权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
/** * if (intf.getName().toLowerCase().equals("eth0") || intf.getName().toLowerCase().equals("wlan0")) * 表示:仅过滤无线和有线的ip. networkInterface是有很多的名称的 * 比如sim0,remt1.....等等.我不需要用到就直接过滤了 * * if (!ipaddress.contains("::")) * 表示: 过滤掉ipv6的地址.不管无线还是有线 都有这个地址, * 我这边显示地址大体是:fe80::288:88ff:fe00:1%eth0 fe80::ee17:2fff:fece:c0b4%wlan0 * 一般都是出现在第一次循环.第二次循环就是真正的ipv4的地址. * * @return * @throws SocketException */ public String GetIpAddress() throws SocketException { String ipaddress = ""; Enumeration<NetworkInterface> netInterfaces = null; try { netInterfaces = NetworkInterface.getNetworkInterfaces(); while (netInterfaces.hasMoreElements()) { NetworkInterface intf = netInterfaces.nextElement(); if (intf.getName().toLowerCase().equals("eth0") | | intf.getName().toLowerCase().equals("wlan0")) { for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { ipaddress = inetAddress.getHostAddress().toString(); if (!ipaddress.contains("::")) {// ipV6的地址 ipaddress = ipaddress; } } } } else { continue; } } } catch (Exception e) { e.printStackTrace(); } // final ContentResolver mContentResolver = getContentResolver(); // Settings.System.putInt( mContentResolver, // Settings.System.WIFI_USE_STATIC_IP, 1); // Settings.System.putString( mContentResolver, // Settings.System.WIFI_STATIC_IP, "你的ip地址"); return ipaddress; } public String getAddress() { WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); // 判断wifi是否开启 if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); } WifiInfo wifiInfo = wifiManager.getConnectionInfo(); DhcpInfo info = wifiManager.getDhcpInfo(); int ipAddress = wifiInfo.getIpAddress(); int ii = info.ipAddress; // return intToIp(ipAddress); return ipAddress + " dhcp: " + ii; } private String intToIp(int i) { return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF); } }
相关文章
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- 复制代码 代码如下: <td> <a href="/member/life/edit_ppt/<?php echo $v->id;?>" class="btn">编辑</a> <a href="javascript:;" onclick="if(confirm('您确定删除这条记录?')){location.href='/member/life/d...2014-06-07
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
- 夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
- 如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- 下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
- java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
- TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
android.os.BinderProxy cannot be cast to com解决办法
本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20- 这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
- 下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
- 首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
- 下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
用Intel HAXM给Android模拟器Emulator加速
Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20- 在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20