2016-10-25 2 views
0

카메라를 사용하여 사진을 찍어 내 NAS로 전송하는 앱을 만들려고합니다. 사진을 찍고 저장 한 튜토리얼을 통해 앱을 만들었습니다. 사진을 보여주고 화면에 보여줍니다. 다른 튜토리얼에서는 화면에 "추가"버튼을 눌러 "선택한"이미지를 업로드하는 방법을 보여줍니다.이 단계를 없애고 사진을 보여주는 대신 직접 NAS에 사진을 보냅니다. 내가 만든Android : 이미지 가져 오기 방금 찍은 bij 카메라

현재 응용 프로그램 : 나는 그것을 모든 작업을 가지고 @Matthias F.에

package com.deshpande.camerademo; 

public class MainActivity extends AppCompatActivity { 

    private Button takePictureButton; 
    private ImageView imageView; 
    private Uri file; 

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

     takePictureButton = (Button) findViewById(R.id.button_image); 
     imageView = (ImageView) findViewById(R.id.imageview); 

     if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      takePictureButton.setEnabled(false); 
      ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == 0) { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED 
        && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
       takePictureButton.setEnabled(true); 
      } 
     } 
    } 

    public void takePicture(View view) { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     file = Uri.fromFile(getOutputMediaFile()); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, file); 

     startActivityForResult(intent, 100); 
    } 

    private static File getOutputMediaFile(){ 
     File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES), "WedCam"); 

     if (!mediaStorageDir.exists()){ 
      if (!mediaStorageDir.mkdirs()){ 
       Log.d("WedCam", "failed to create directory"); 
       return null; 
      } 
     } 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     return new File(mediaStorageDir.getPath() + File.separator + 
        "IMG_"+ timeStamp + ".jpg"); 
    } 

    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 100) { 
     if (resultCode == RESULT_OK) { 

      try { 

       final FTPClient client = new FTPClient(); 
       final File image = new File(file.getPath()); 
       final FileInputStream fis = new FileInputStream(image); 

       Thread thread = new Thread(new Runnable() { 

        @Override 
        public void run() { 
         try { 

          client.connect("ftp://127.0.0.1:2221"); 
          client.login("francis", "francis"); 

          client.storeFile(image.getName(), fis); 
          client.logout(); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 

       thread.start(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
       } 
      } 
     } 
    } 
} 

덕분에,이 사람은 위대하다!

+0

이 두 개의 자습서를 결합하면됩니다. 먼저 이미지를 가져 와서 onActivityResult에서 생성 된 파일을 업로드하십시오. –

+0

두 튜토리얼은 다른 접근법을 가지고 있습니다. 업로드 튜토리얼은 PHP를 사용했고, 나는 그것을 선호하는 ftp라고 생각합니다. 꽤 많은 ftp 예제를 발견 할 수 있지만, 필자가 올바르게 이해할 수없는 것 같습니다. 나는 이미 FTP 서버를 가지고 있으며, 생성 된 파일을 사용하고 내 IP 주소로 업로드하는 예제 코드가 필요하다. 이해가 잘된다면 "imageView.setImageURI (file);"을 대체해야합니다. – user3032387

+0

네 맞습니다. 생성 된 파일은'onActivityResult'-Method에 있습니다. 이제 업로드 프로세스를 시작해야합니다. [Here] (https://stackoverflow.com/questions/6527664/how-do-you-upload-a-file-to-an-ftp-server)는 FTP 서버에 파일을 업로드하는 방법을 보여주는 예입니다. –

답변

0

FileInputStream에 카메라에서 저장된 URI를 사용해야합니다. 이 그것을 시도 : 생성 된 이미지

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 100) { 
     if (resultCode == RESULT_OK) { 

      try { 

       final FTPClient client = new FTPClient(); 
       final File image = new File(file.getPath()); 
       final FileInputStream fis = new FileInputStream(image); 

       Thread thread = new Thread(new Runnable() { 

        @Override 
        public void run() { 
         try { 

          client.connect("127.0.0.1", 2221); 
          client.login("francis", "francis"); 
          client.setFileType(FTP.BINARY_FILE_TYPE); 

          client.storeFile(image.getName(), fis); 
          client.logout(); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 

       thread.start(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

이제 FileInputStream 점을.

EDIT : 문제는 업로드가 UI 스레드에서 실행되었고 안드로이드에서 허용되지 않는 것이 었습니다. 이제 새로운 Thead가 업로드 프로세스를 위해 만들어졌습니다. 또한 네트워크 기능 사용에 대한 android 권한에 액세스해야한다고 말한 것을 잊었습니다. So you need to set <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />AndroidManifest.xml.

+0

고맙지 만 "client.storeFile (filename, fis);" 그것은 파일 이름을 해결할 수 없습니다. – user3032387

+0

이제 제대로 작동합니다. –

+0

앱을 오류없이 설치할 수 있지만 이미지를 가져 와서 수락하면 앱이 다운됩니다. 사진을 내부 저장 장치에 저장하므로 업로드 부분에 여전히 문제가 있다고 생각합니다. 오류 코드가 원래 게시물에 추가되었습니다. – user3032387

관련 문제