2017-09-12 22 views
1

対象:
終了できない単目的アプリを開発しようとしています。それは電話で "オペレーティングシステム"として実行する必要があります。この電話は、さらなる目的のために使用されます。アプリはプレイストアにはありませんし、あなたはそれを残すことができませんので、私は新しいバージョンを持っている場合はそれを更新する必要があります。この目的のために、私はあなたが "アップデーターアプリ"と呼ぶことができる別のアプリを書いた。私はBluetooth経由でこのアップデートをしたい。私はすでにすべてを準備しており、ファイル転送の準備ができています。電話機はInsecureRfcommSocketで接続できます。Android Bluetoothファイル転送.apk

sendUpdateButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mBtService != null) { 
       Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
       intent.setType("application/vnd.android.package-archive"); 
       intent.addCategory(Intent.CATEGORY_OPENABLE); 

       try { 
        startActivityForResult(Intent.createChooser(intent, "Choose .apk"), FILE_SELECT_CODE); 
       } catch (android.content.ActivityNotFoundException ex) { 
        Toast.makeText(getApplicationContext(), "No File-Explorer found", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    }); 

とonActivityResult::私は、私はこのコードでバイトにURIを変換するアップデータアプリと - 私のチューを送信したいの.apkファイルを選択することも、管理

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK && data != null) { 
     Uri selectedFile = data.getData(); 
     try { 
      byte[] sendingByte = readBytes(selectedFile); 
      mBtService.send(sendingByte); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), R.string.transmissionFailed, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

readBytes機能:以下の関数はConnectedThreadで呼び出されmBtService.send(sendingByte)行と

public byte[] readBytes(Uri uri) throws IOException { 
    InputStream inputStream = getContentResolver().openInputStream(uri); 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
    } 
    return byteBuffer.toByteArray(); 
} 

 public void send(byte[] selectedFile) { 
     try { 
      mmOutStream.write(selectedFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

問題:受信機の電話I'veで
バイトを受信して​​、バックファイル/ URI(ノーアイデアまだ)の.apkにそれを変換して実行するために自分の携帯電話に保存する方法は考えを持っていませんこの質問の一部ではない別のボタンで

質問:
だから私の質問は、仕上がりが意図する私の管理するために、受信機の電話アプリのコードINにすることは何ですか?関連するコードを投稿しなかった場合、申し訳ありませんが、あなたのリクエストに追加します。私はこの両方のアプリを私の研究のためにプログラムしなければならないので、私はどんな助けにも感謝しています。

答えて

0

受信したバイトをByteArrayに保存してファイルに保存するソリューションが見つかりました。私のブルートゥースConnectedThreadでは、私は()メソッド次の実行を持っている:

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     byte[] buffer = new byte[1024]; 
     int len; 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
     try { 
      while ((len = mmInStream.read(buffer)) != -1) { 
       byteBuffer.write(buffer, 0, len); 
       mHandler.obtainMessage(Constants.MESSAGE_READ, len, -1, byteBuffer.toByteArray()) 
         .sendToTarget(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      connectionLost(); 
     } 
    } 

そして、私の活動に私は、次のハンドラMESSAGE_READありますの.apkが正規のダウンロードに保存されます。このコードで

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case Constants.MESSAGE_STATE_CHANGE: 
       ... 
       break; 
      case Constants.MESSAGE_READ: 
       byte[] buffer = (byte[]) msg.obj; 
       try { 
        String filePath = Environment.getExternalStorageDirectory() + "/download/app.apk"; 
        File file = new File(filePath); 
        file.getParentFile().mkdirs(); 
        if (file.exists()) { 
         file.delete(); 
         file.createNewFile(); 
        } 
        else 
         file.createNewFile(); 
        BufferedOutputStream objectOut = new BufferedOutputStream(new FileOutputStream(file)); 
        objectOut.write(buffer); 
        objectOut.close(); 
        } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       break; 
     } 
    } 
}; 

をフォルダを「app.apk」とします。

これは誰にとっても役立ちます。

関連する問題