【发布时间】:2017-03-07 15:25:06
【问题描述】:
我正在尝试制作一个使用相机拍照并将其发送到我的 NAS 的应用程序,我设法通过教程创建了一个应用程序,该教程拍摄照片,保存照片并将其显示在屏幕上。另一个教程向我展示了如何通过按屏幕上的“额外”按钮上传“选定”图像,只是我想摆脱这一步而不是显示图片,而是直接将图片发送到我的 NAS。
我创建的当前应用:
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();
}
}
}
}
}
}
感谢@Matthias F。我成功了,这家伙很棒!
【问题讨论】:
-
只需将这两个教程结合起来。先拍摄一张图片,然后将创建的文件上传到
onActivityResult。 -
两个教程都有不同的方法,上传教程使用php,我想我更喜欢ftp。虽然我可以找到相当多的 ftp 示例,但我似乎无法正确使用它们。我已经有一个 ftp 服务器,我只需要一个使用创建的文件并上传到我的 IP 地址的示例代码。如果我理解正确,我需要替换“imageView.setImageURI(file);”
-
是的,没错。您在
onActivityResult-Method 中创建了文件。因此,此时您需要启动上传过程。 Here 是如何将文件上传到 ftp 服务器的示例。 -
我确定我做错了,我复制了示例并将其添加到我的代码中。可能我创建 InputStream 并声明要上传的文件的地方是错误的。查看更新的代码
标签: android image upload camera photo