2017-09-12 1 views
1

의도 :
종료 할 수없는 단일 용도의 앱을 개발하려고합니다. 그것은 "운영 체제"로 전화에서 실행해야합니다. 이 전화는 추가 목적으로 사용됩니다. 앱은 플레이 스토어에 없으며 최신 버전이있는 경우 업데이트하지 않아도됩니다. 이 목적을 위해 나는 "updater-app"라고 부를 수있는 또 다른 앱을 작성했습니다. 블루투스를 통해이 업데이트를하고 싶습니다. 이미 모든 것을 준비했고 파일 전송 준비가 완료되었습니다. 전화기는 InsecureRfcommSocket으로 연결할 수 있습니다.Android 블루투스 파일 전송 .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를 :

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(); 
     } 
    } 
} 
또한이 코드 바이트로 URI를 변환하는 업데이터 인앱 츄와 미안 함께 보낼의 .apk 파일을 선택 관리

의 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를하고 실행하는 내 휴대폰에 저장하는 아무 생각 없어 수신기 전화에서
이 질문의 일부가 아닌 또 다른 버튼이 있습니다.

질문 :
그래서 내 질문이 마무리 의도의 나 관리 수신기 전화 응용 프로그램의 코드에서 무엇을하는 방법 있나요? 관련 코드를 게시하지 못한 경우 죄송합니다. 요청에 추가 할 것입니다. 이 두 가지 앱을 모두 내 프로그램으로 프로그래밍해야하기 때문에 어떤 도움을 주셔서 감사합니다.

답변

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"로 변경하십시오.

희망은 누구에게나 유용합니다.