真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、玉泉街道網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為玉泉街道等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

概述

今天逛簡(jiǎn)書(shū)的時(shí)候,發(fā)現(xiàn)了一個(gè)庫(kù):

https://github.com/MZCretin/WifiTransfer-master

主要功能是這樣的,先口述一下,當(dāng)打開(kāi)app,可以通過(guò)瀏覽器訪問(wèn)一個(gè)地址,然后通過(guò)瀏覽器可以給手機(jī)上上傳apk(也支持已有apk刪除),然后手機(jī)端可以安裝、卸載該apk。

三張圖就明白了:

應(yīng)用啟動(dòng)后:

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

然后PC端訪問(wèn):

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

拖拽apk上傳,即可上傳到手機(jī)端。

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

ok,大致介紹清楚了。

注意一定要在同一個(gè)網(wǎng)段。

先不談其用處到底有多大,很多時(shí)候我看到一個(gè)項(xiàng)目的時(shí)候,很少考慮其能干嘛,考慮最多的是它是如何實(shí)現(xiàn)的,我會(huì)么,不會(huì)那就學(xué),至于能干嘛,那要等我學(xué)會(huì)之后?

那么思考下他的實(shí)現(xiàn),這種上傳文件的方式,在PC端更加常見(jiàn),上傳文件到服務(wù)器。

說(shuō)到這,就可以想到,可能這個(gè)app在手機(jī)端搭建了一個(gè)服務(wù)器。

恩,沒(méi)錯(cuò)就是這樣的,在手機(jī)端搭建了一個(gè)服務(wù)器,這樣就可以通過(guò)html,將PC端的文件傳給手機(jī)端,然后手機(jī)端收到后再同步界面。

同時(shí),也可以將手機(jī)上Sdcard上的文件,完全在PC上呈現(xiàn)。

手機(jī)端的Server利用的是該庫(kù):https://github.com/koush/AndroidAsync

解析源碼的事情就不做了,有興趣可以自己學(xué)習(xí)下,接下來(lái)開(kāi)始正片。

一個(gè)群友的問(wèn)題

之所以會(huì)關(guān)注到這個(gè)庫(kù),是因?yàn)樵趙anandroid群,有個(gè)哥們連續(xù)問(wèn)了好久的一個(gè)問(wèn)題,問(wèn)題是:

如何通過(guò)瀏覽器輸入一個(gè)地址播放手機(jī)上的視頻

當(dāng)時(shí)也很多人回答,回答的核心都是正確的。

當(dāng)然我恰好看到這個(gè)庫(kù),之前也沒(méi)推送過(guò)相關(guān)內(nèi)容,所以我決定寫(xiě)個(gè)簡(jiǎn)易的Demo.

當(dāng)然是Demo就沒(méi)有什么美觀可言了,僅為快速實(shí)現(xiàn)效果。

效果圖是這樣的:

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

頁(yè)面上顯示手機(jī)上的視頻列表,然后點(diǎn)擊某個(gè)視頻,即開(kāi)始播放該視頻。

有了上例參考,非常簡(jiǎn)單。

注:部分代碼直接從上例copy。

該案例需要網(wǎng)絡(luò)和Sdcard權(quán)限!

先把服務(wù)器搭起來(lái)依賴庫(kù)

首先,依賴下我們搭建Server需要用到的庫(kù):

compile 'com.koushikdutta.async:androidasync:2.+'

編寫(xiě)簡(jiǎn)易html

然后我們?cè)赼ssets下編寫(xiě)一個(gè)html文件用于瀏覽器訪問(wèn),index.html

最簡(jiǎn)單的即可:




  




嘿嘿嘿,連通了...



啟動(dòng)服務(wù),監(jiān)聽(tīng)端口

public class MainActivity extends AppCompatActivity {
  private AsyncHttpServer server = new AsyncHttpServer();
  private AsyncServer mAsyncServer = new AsyncServer();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    server.get("/", new HttpServerRequestCallback() {
      @Override
      public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
        try {
          response.send(getIndexContent());
        } catch (IOException e) {
          e.printStackTrace();
          response.code(500).end();
        }
      }
    });

    server.listen(mAsyncServer, 54321);

  }

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (server != null) {
      server.stop();
    }
    if (mAsyncServer != null) {
      mAsyncServer.stop();
    }
  }

  private String getIndexContent() throws IOException {
    BufferedInputStream bInputStream = null;
    try {
      bInputStream = new BufferedInputStream(getAssets().open("index.html"));
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      int len = 0;
      byte[] tmp = new byte[10240];
      while ((len = bInputStream.read(tmp)) > 0) {
        baos.write(tmp, 0, len);
      }
      return new String(baos.toByteArray(), "utf-8");
    } catch (IOException e) {
      e.printStackTrace();
      throw e;
    } finally {
      if (bInputStream != null) {
        try {
          bInputStream.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

可以看到很簡(jiǎn)單,創(chuàng)建AsyncHttpServer對(duì)象,我們?cè)趏nCreate中調(diào)用get,對(duì)外設(shè)置一個(gè)get型的url監(jiān)聽(tīng),監(jiān)聽(tīng)的url是/即根目錄。

然后調(diào)用listen,傳入端口號(hào)54321,開(kāi)啟對(duì)該端口的監(jiān)聽(tīng)。

onDestroy的時(shí)候停止服務(wù)器。

當(dāng)捕獲到對(duì)”/”的訪問(wèn)時(shí),讀取assets下的index.html返回給瀏覽器。

記得添加網(wǎng)絡(luò)權(quán)限。

好了,運(yùn)行demo,測(cè)試一下。

輸入地址,你的手機(jī)的IP:端口號(hào)。

注意電腦和手機(jī)在同一個(gè)網(wǎng)段!

然后你應(yīng)該看到如下效果圖:

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

如果沒(méi)看到,那不用往下了,先找問(wèn)題吧~

完善Demo

接下來(lái),我們將手機(jī)上的mp4返回讓其在瀏覽器上顯示。

很簡(jiǎn)單,既然我們可以監(jiān)聽(tīng)/,返回一個(gè)index.html,我們就能監(jiān)聽(tīng)另一個(gè)url,返回文件目錄。

server.get("/files", new HttpServerRequestCallback() {
  @Override
  public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
    JSONArray array = new JSONArray();
    File dir = new File(Environment.getExternalStorageDirectory().getPath());
    String[] fileNames = dir.list();
    if (fileNames != null) {
      for (String fileName : fileNames) {
        File file = new File(dir, fileName);
        if (file.exists() && file.isFile() && file.getName().endsWith(".mp4")) {
          try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name", fileName);
            jsonObject.put("path", file.getAbsolutePath());
            array.put(jsonObject);
          } catch (JSONException e) {
            e.printStackTrace();
          }
        }
      }
    }
    response.send(array.toString());
  }
});

我們監(jiān)聽(tīng)/files這個(gè)Url,然后返回Sdcard根目錄的視頻文件,拼接成JSON返回。

這里如果你重新啟動(dòng),在瀏覽器上輸入:

http://192.168.1.100:54321/files

會(huì)看到一堆JSON數(shù)據(jù):

如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

但是我們需要在剛才的html上顯示,所以這個(gè)請(qǐng)求應(yīng)該是剛才的Html頁(yè)面發(fā)起:




  
  
  文檔的標(biāo)題
  
    $(function() {
      var now = new Date();
      var url = 'files' + '?' + now.getTime();
      // 請(qǐng)求JSON數(shù)據(jù)
      $.getJSON(url, function(data) {
        // 編輯JSON數(shù)組
        for (var i = 0; i < data.length; i++) {
          // 為每個(gè)對(duì)象生成一個(gè)li標(biāo)簽,添加到頁(yè)面的ul中
          var $li = $('
  • ' + data[i].name + '
  • ');           $li.attr("path", data[i].path);           $("#filelist").append($li);         }       });     });      

    可能很多朋友沒(méi)了解過(guò)js,不過(guò)應(yīng)該能看明白,$.getJSON獲取返回的JSON數(shù)組,然后遍歷為每個(gè)Json對(duì)象生成一個(gè)li標(biāo)簽,添加到頁(yè)面上。

    這里用了jquery,對(duì)于js的也需要也請(qǐng)求處理,這里省略了,很簡(jiǎn)單,看源碼即可。

    此時(shí)訪問(wèn),已經(jīng)可以顯示出視頻目錄了:

    如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析

    接下來(lái)就是點(diǎn)擊播放了,在html里面有個(gè)標(biāo)簽叫video用于播放視頻的,他有個(gè)src屬性用于設(shè)置播放的視頻路徑。

    所以我們要做的僅為:

    點(diǎn)擊名字,拿到該視頻對(duì)應(yīng)的url,然后設(shè)置給video的src屬性即可。

    那么視頻的url是什么?

    剛才我們返回了視頻的路徑,所以我們只要再監(jiān)聽(tīng)一個(gè)url,將根據(jù)傳入的視頻路徑,將視頻文件流返回即可。

    server.get("/files/.*", new HttpServerRequestCallback() {
      @Override
      public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
        String path = request.getPath().replace("/files/", "");
        try {
          path = URLDecoder.decode(path, "utf-8");
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }
        File file = new File(path);
        if (file.exists() && file.isFile()) {
          try {
            FileInputStream fis = new FileInputStream(file);
            response.sendStream(fis, fis.available());
          } catch (Exception e) {
            e.printStackTrace();
          } 
          return;
        }
        response.code(404).send("Not found!");
      }
    });

    我們又監(jiān)聽(tīng)了一個(gè)url為files/xxx.*,捕獲到之后,拿到文件名,去SDCard找到該文件,返回文件流即可。

    html端的代碼為:

    
      $(function() {
        var now = new Date();
        // 拿到video對(duì)象
        var $video = $("#videoplayer");
        var url = 'files' + '?' + now.getTime();
        $.getJSON(url, function(data) {
          for (var i = 0; i < data.length; i++) {
            var $li = $('
  • ' + data[i].name + '
  • ');         $li.attr("path", data[i].path);         $("#filelist").append($li);         // 點(diǎn)擊的時(shí)候,獲取路徑,設(shè)置給video的src屬性         $li.click(function() {           var p = "/files/" + $(this).attr("path");           $video.attr("src", "/files/" + $(this).attr("path"));           $video[0].play();         });       }     });   });

    當(dāng)然頁(yè)面上body標(biāo)簽內(nèi)部也多了一個(gè)video標(biāo)簽。

     
     

    關(guān)于“如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


    網(wǎng)站名稱:如何搭建Android上的服務(wù)器實(shí)現(xiàn)隔空取物的示例分析
    本文URL:http://weahome.cn/article/gchphg.html

    其他資訊

    在線咨詢

    微信咨詢

    電話咨詢

    028-86922220(工作日)

    18980820575(7×24)

    提交需求

    返回頂部