Android5.0開發範例大全 讀書筆記(四)

来源:http://www.cnblogs.com/xx-wqj/archive/2016/10/22/5987594.html
-Advertisement-
Play Games

(三)通信和聯網 3.1顯示Web信息 1.WebView通過loadUrl()方法直接訪問網頁時,點擊跳轉鏈接會打開系統預設的瀏覽器,若要攔截WebView事件,可為其添加WebViewClient 2.WebView預設不支持JavaScript,要通過setJavaScriptEnabled( ...


(三)通信和聯網

3.1顯示Web信息

1.WebView通過loadUrl()方法直接訪問網頁時,點擊跳轉鏈接會打開系統預設的瀏覽器,若要攔截WebView事件,可為其添加WebViewClient

webView.setWebViewClient(new WebViewClient())

2.WebView預設不支持JavaScript,要通過setJavaScriptEnabled()進行設置

 webView.getSettings().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();
        task.execute(url);
    }


    private class DownloadTask extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(String... params) {
            String url = params[0];
            try {
                URLConnection connection = (new URL(url)).openConnection();
                InputStream is = connection.getInputStream();
                return BitmapFactory.decodeStream(is);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            mImage = new BitmapDrawable(getContext().getResources(), bitmap);
            setImageDrawable(mImage);
        }
    }
}

3.5完全在後臺下載

1.DownloadManager適合處理和管理需要長時間運行的下載操作。其優點是即使在下載失敗,鏈接改變甚至設備重啟時,依然會繼續嘗試下載

2.首先實現一個廣播接收者來監聽下載狀態

 private BroadcastReceiver receiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            queryDownloadStatus();
        }
    };

    private void queryDownloadStatus(){
        DownloadManager.Query query=new DownloadManager.Query();
        query.setFilterById(prefs.getLong(DL_ID,0));
        Cursor c=dm.query(query);
        if(c.moveToFirst()){
            int status=c.getInt(c.getColumnIndex(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.openDownloadedFile(prefs.getLong(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_FAILED:
                    dm.remove(prefs.getLong(DL_ID, 0));
                    prefs.edit().clear().apply();
                    break;
            }
        }
    }

3.接著獲取系統服務

dm= (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

4.最後,在onResume中註冊廣播並開始下載

 @Override
    protected void onResume() {
        super.onResume();
        if(!prefs.contains(DL_ID)){
            Uri resource=Uri.parse("http://f2.market.xiaomi.com/download/AppChannel/0965d34f016634cb83347f609306d9a3fa045a9c5/com.netease.onmyoji.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 id=dm.enqueue(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() {
        @Override
        public 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() {
        @Override
        public 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中註冊和註銷廣播

 @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(sent, new IntentFilter(ACTION_SENT));
        registerReceiver(delivered,new IntentFilter(ACTION_DELIVERED));
    }
 @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(sent);
        unregisterReceiver(delivered);
    }

4.最後調用SmsManager即可

private void sendSms(String msg) {
        PendingIntent sIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_SENT),0);
        PendingIntent dIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_DELIVERED),0);
        SmsManager manager=SmsManager.getDefault();
        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方法來獲取藍牙的啟動情況

@Override
    protected 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() {
            @Override
            public void onClick(View v) {
                email = emailField.getText().toString();
                if (mBtAdapter.getScanMode() != 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();
        task.execute(MY_UUID);
        setProgressBarIndeterminateVisibility(true);
    }

5.另一方要讓設備掃描可連入的設備,主要通過startDiscovery()方法

scanButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                email = emailField.getText().toString();
                mBtAdapter.startDiscovery();
                setProgressBarIndeterminateVisibility(true);
            }
        });

6.程式要使用2個AsyncTask來執行具體的功能,一個用來連接

private class AcceptTask extends AsyncTask<UUID, Void, BluetoothSocket> {

        @Override
        protected BluetoothSocket doInBackground(UUID... params) {
            String name = mBtAdapter.getName();
            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;
            }
        }

        @Override
        protected void onPostExecute(BluetoothSocket bluetoothSocket) {
            mBtSocket = bluetoothSocket;
            ConnectedTask task = new ConnectedTask();
            task.execute(mBtSocket);

        }
    }

7.另一個用來傳輸數據

 private class ConnectedTask extends AsyncTask<BluetoothSocket, Void, String> {

        @Override
        protected String doInBackground(BluetoothSocket... params) {
            InputStream in = null;
            OutputStream out = null;
            try {
                //發送數據
                out = params[0].getOutputStream();
                out.write(email.getBytes());
                //接受其他數據
                in = params[0].getInputStream();
                byte[] buffer = new byte[1024];
                in.read(buffer);
                String result = new String(buffer);
                mBtSocket.close();
                return result.trim();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(ExchangeActivity.this, result, Toast.LENGTH_SHORT).show();
            setProgressBarIndeterminateVisibility(false);

        }
    }

8.兩個AsyncTask之間使用BroadCast進行連接

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device.getName().equals(SEARCH_NAME)) {
                    mBtAdapter.cancelDiscovery();
                    try {
                        mBtSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
                        mBtSocket.connect();
                        ConnectedTask task = new ConnectedTask();
                        task.execute(mBtSocket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                setProgressBarIndeterminateVisibility(false);
            }
        }
    };

9.廣播接收者分別在resume和pause中註冊和註銷

@Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(mReceiver, filter);
    }

10.create中一些初始化信息

 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.activity_exchange);
        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        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(R.id.emailField);

 11.退出時將藍牙的Socket清除

 @Override
    protected void onDestroy() {
        super.onDestroy();
        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) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo current = mManager.getActiveNetworkInfo();
        return current != null && current.getState() == NetworkInfo.State.CONNECTED;
    }

 

3.是否可以獲取wifi

public static boolean isWifiReachable(Context context) {
        final ConnectivityManager mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo current = mManager.getActiveNetworkInfo();
        return current != null && current.getType() == ConnectivityManager.TYPE_WIFI;
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 箭頭函數(Arrow Functions) 就像名字所說那樣,箭頭函數使用箭頭(=>)來定義函數。與傳統函數相比,箭頭函數在多個地方表現不一樣。 箭頭函數語法(Arrow Function Syntax) 箭頭函數有多種實現方法。比如你想實現一個只有一個參數並且直接返回此參數值的函數: 上面的例子中 ...
  • HTML 語法 用兩個空格來代替製表符(tab) -- 這是唯一能保證在所有環境下獲得一致展現的方法。 嵌套元素應當縮進一次(即兩個空格)。 對於屬性的定義,確保全部使用雙引號,絕不要使用單引號。 不要在自閉合(self-closing)元素的尾部添加斜線 --HTML5 規範中明確說明這是可選的。... ...
  • 今天電腦按了一下xampp,結果運行wamp的時候,出現了下麵的情況: 在網上查了一下,結果是埠被占用,然後我就手動修改了一下。 1.修改xampp的埠號 依次找到:XAMPP的安裝目錄(比如D:\xampp)\apache\conf\httpd.conf,用記事本或notepad等工具打開ht ...
  • js做全選,用一個checkbox覆選框做多個checkbox覆選框的全選按鈕,有一個覆選框未被選擇時,全選按鈕的checked就為false ...
  • 為了讓裡面支持中文,我們加入這句話header("content-type:text/html;charset=utf-8"),此時的tigong.php如下 用我們的瀏覽器跑一下,如圖:將地址欄的信息地址複製一份,用postman測一下數據,如果不知道什麼是postman,請自行百度,後面的數據交 ...
  • 一、概述: 所有的應用程式都需要“數據”支持。對於大多數的Web應用程式來說,數據是在伺服器端進行組織和整理,然後由客戶端(瀏覽器端)通過網路請求獲取。隨著瀏覽器的處理能力不斷增強,可以在瀏覽器端存儲和操縱應用程式需要的數據,因此越來越多的網站開始考慮,將大量數據儲存在本地客戶端,這樣可以減少用戶等 ...
  • public class MainActivity extends Activity { Button bt; Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate ...
  • 1.指定動畫一直旋轉 android:repeatCount 重覆的次數,預設為0,必須是int,可以為-1表示不停止 1 public class AnitVirusActivity extends Activity { 2 protected static final int SCANING = ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...