(三)通信和联网
3.1显示Web信息
1.WebView通过loadUrl()方法直接访问网页时,点击跳转链接会打开系统默认的浏览器,若要拦截WebView事件,可为其添加WebViewClient
webView.setWebViewClient(new WebViewClient())
2.WebView默认不支持JavaScript,要通过setJavaScriptEnabled()进行设置
Settings().setJavaScriptEnabled(true);
3.WebView可以直接显示Html内容
3.4下载图片文件
1.自定义一个ImageView控件,实现资源的下载与显示
值得一提的是,设置本地资源应该提供2个方法,一个通过资源id获取,一个通过drawable获取
网络下载可以通过asynctask实现,要注意不要在doInBackground()中更新UI线程
下面附上完整代码
public class WebImageView extends ImageView {private Drawable mPlaceholder, mImage;public WebImageView(Context context) {this(context, null);}public WebImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public WebImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public void setPlaceholderImage(Drawable drawable) {mPlaceholder = drawable;if (mImage == null) {setImageDrawable(mPlaceholder);}}public void setPlaceholderImage(int resid) {mPlaceholder = getResources().getDrawable(resid);System.out.println(1);if (mImage == null) {System.out.println(2);setImageDrawable(mPlaceholder);}}public void setImageUrl(String url) {DownloadTask task = new DownloadTask();ute(url);}private class DownloadTask extends AsyncTask<String, Void, Bitmap> {@Overrideprotected Bitmap params) {String url = params[0];try {URLConnection connection = (new URL(url)).openConnection();InputStream is = InputStream();return BitmapFactory.decodeStream(is);} catch (IOException e) {e.printStackTrace();return null;}}@Overrideprotected void onPostExecute(Bitmap bitmap) {mImage = new BitmapDrawable(getContext().getResources(), bitmap);setImageDrawable(mImage);}} }
3.5完全在后台下载
1.DownloadManager适合处理和管理需要长时间运行的下载操作。其优点是即使在下载失败,链接改变甚至设备重启时,依然会继续尝试下载
2.首先实现一个广播接收者来监听下载状态
private BroadcastReceiver receiver=new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {queryDownloadStatus();}};private void queryDownloadStatus(){DownloadManager.Query query=new DownloadManager.Query();query.Long(DL_ID,0));Cursor c=dm.query(query);veToFirst()){int statusColumnIndex(DownloadManager.COLUMN_STATUS));switch (status){case DownloadManager.STATUS_PAUSED:case DownloadManager.STATUS_PENDING:case DownloadManager.STATUS_RUNNING:break;case DownloadManager.STATUS_SUCCESSFUL:try {ParcelFileDescriptor file=dm.Long(DL_ID,0));FileInputStream fis=new ParcelFileDescriptor.AutoCloseInputStream(file);imageView.setImageBitmap(BitmapFactory.decodeStream(fis));Toast.makeText(this,"download over!",Toast.LENGTH_SHORT).show();} catch (FileNotFoundException e) {e.printStackTrace();}break;case DownloadManager.STATUS_Long(DL_ID, 0));prefs.edit().clear().apply();break;}}}
3.接着获取系统服务
dm= (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
4.最后,在onResume中注册广播并开始下载
@Overrideprotected void onResume() {Resume();if(!ains(DL_ID)){Uri resource=Uri.parse(ji.mi.apk");DownloadManager.Request request=new DownloadManager.Request(resource);request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE| DownloadManager.Request.NETWORK_WIFI);request.setTitle("Download Sample");request.setDescription("Download SSR!");request.setAllowedOverRoaming(false);long idqueue(request);prefs.edit().putLong(DL_ID,id).apply();}else{queryDownloadStatus();}registerReceiver(receiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));}
3.10发送短信
1.与之前的DownloadManager一样,发送短信的SmsManager也是系统级服务,二者的调用极为相似
2..首先实现广播接收者,发送短信一共有2个接受者,一个返回发送是否成功
private BroadcastReceiver sent = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK:Toast.makeText(SendSmsActivity.this, "发送成功", Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:case SmsManager.RESULT_ERROR_NO_SERVICE:case SmsManager.RESULT_ERROR_NULL_PDU:case SmsManager.RESULT_ERROR_RADIO_OFF:Toast.makeText(SendSmsActivity.this, "发送失败", Toast.LENGTH_SHORT).show();break;}}};
另一个返回接收是否成功
private BroadcastReceiver delivered = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK:Toast.makeText(SendSmsActivity.this, "传递成功", Toast.LENGTH_SHORT).show();break;case Activity.RESULT_CANCELED:Toast.makeText(SendSmsActivity.this, "传递失败", Toast.LENGTH_SHORT).show();break;}}};
3.接着,分别在resume和pause中注册和注销广播
@Overrideprotected void onResume() {Resume();registerReceiver(sent, new IntentFilter(ACTION_SENT));registerReceiver(delivered,new IntentFilter(ACTION_DELIVERED));}
@Overrideprotected void onPause() {Pause();unregisterReceiver(sent);unregisterReceiver(delivered);}
4.最后调用SmsManager即可
private void sendSms(String msg) {PendingIntent sIntent = Broadcast(this, 0, new Intent(ACTION_SENT),0);PendingIntent dIntent = Broadcast(this, 0, new Intent(ACTION_DELIVERED),0);SmsManager managerDefault();manager.sendTextMessage(RECIPIENT_ADDRESS,null,msg,sIntent,dIntent);}
3.11蓝牙通信
1.蓝牙通信需要获取权限
<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
2.有时蓝牙并没有开启,所以要通过startActivityForResult启动
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE);
3.此时应该设置一个onActivityResult方法来获取蓝牙的启动情况
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case REQUEST_ENABLE:if (resultCode != RESULT_OK) {Toast.makeText(this, "蓝牙启动失败", Toast.LENGTH_SHORT).show();finish();}break;case REQUEST_DISCOVERABLE:if (resultCode == RESULT_CANCELED) {Toast.makeText(this, "蓝牙必须被设置为可见", Toast.LENGTH_SHORT).show();finish();} else {startListening();}break;default:break;}}
4.蓝牙功能分两方,一方让设备处于监听状态,监听其他设备的连入
listenButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {email = Text().toString();if (ScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3000);startActivityForResult(discoverableIntent, REQUEST_DISCOVERABLE);}startListening();}});
监听时要用到唯一的UUID
private void startListening() {AcceptTask task = new AcceptTask();ute(MY_UUID);setProgressBarIndeterminateVisibility(true);}
5.另一方要让设备扫描可连入的设备,主要通过startDiscovery()方法
scanButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {email = Text().toString();mBtAdapter.startDiscovery();setProgressBarIndeterminateVisibility(true);}});
6.程序要使用2个AsyncTask来执行具体的功能,一个用来连接
private class AcceptTask extends AsyncTask<UUID, Void, BluetoothSocket> {@Overrideprotected BluetoothSocket params) {String name = Name();mBtAdapter.setName(SEARCH_NAME);try {BluetoothServerSocket socket = mBtAdapter.listenUsingRfcommWithServiceRecord("BluetoothRecipe", params[0]);BluetoothSocket connected = socket.accept();mBtAdapter.setName(name);return connected;} catch (IOException e) {e.printStackTrace();mBtAdapter.setName(name);return null;}}@Overrideprotected void onPostExecute(BluetoothSocket bluetoothSocket) {mBtSocket = bluetoothSocket;ConnectedTask task = new ConnectedTask();ute(mBtSocket);}}
7.另一个用来传输数据
private class ConnectedTask extends AsyncTask<BluetoothSocket, Void, String> {@Overrideprotected String params) {InputStream in = null;OutputStream out = null;try {//发送数据out = params[0].getOutputStream();out.Bytes());//接受其他数据in = params[0].getInputStream();byte[] buffer = new byte[1024];in.read(buffer);String result = new String(buffer);mBtSocket.close();im();} catch (IOException e) {e.printStackTrace();return null;}}@Overrideprotected void onPostExecute(String result) {Toast.makeText(ExchangeActivity.this, result, Toast.LENGTH_SHORT).show();setProgressBarIndeterminateVisibility(false);}}
8.两个AsyncTask之间使用BroadCast进行连接
private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = Action();if (BluetoothDevice.ACTION_FOUND.equals(action)) {BluetoothDevice device = ParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (Name().equals(SEARCH_NAME)) {mBtAdapter.cancelDiscovery();try {mBtSocket = ateRfcommSocketToServiceRecord(MY_UUID);t();ConnectedTask task = new ConnectedTask();ute(mBtSocket);} catch (IOException e) {e.printStackTrace();}}} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {setProgressBarIndeterminateVisibility(false);}}};
9.广播接收者分别在resume和pause中注册和注销
@Overrideprotected void onResume() {Resume();IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter);filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(mReceiver, filter);}
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);setContentView(R.layout.activity_exchange);mBtAdapter = DefaultAdapter();if (mBtAdapter == null) {Toast.makeText(this, "不支持蓝牙", Toast.LENGTH_SHORT).show();finish();}//开启蓝牙if (!mBtAdapter.isEnabled()) {Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableIntent, REQUEST_ENABLE);}emailField = (EditText) findViewById(ailField);
11.退出时将蓝牙的Socket清除
@Overrideprotected void onDestroy() {Destroy();if (mBtSocket != null) {try {mBtSocket.close();} catch (IOException e) {e.printStackTrace();}}}
3.12查询网络状态
1.通过系统服务ConnectivityManager来获取网络状态
2.是否可以获取网络
public static boolean isNetworkReachable(Context context) {final ConnectivityManager mManager = (ConnectivityManager) SystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo current = ActiveNetworkInfo();return current != null && State() == NetworkInfo.State.CONNECTED;}
3.是否可以获取wifi
public static boolean isWifiReachable(Context context) {final ConnectivityManager mManager = (ConnectivityManager) SystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo current = ActiveNetworkInfo();return current != null && Type() == ConnectivityManager.TYPE_WIFI;}
转载于:.html
本文发布于:2024-02-03 01:05:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170689356447647.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |