Anonymous
Не удалось загрузить изображение/видео в приложение для сохранения его в корзине AWS S3.
Сообщение
Anonymous » 13 ноя 2024, 13:49
Итак, я создаю приложение, которое будет принимать вводимые пользователем данные и сохранять их в корзине s3.
Код: Выделить всё
package com.example.myapplication;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.VideoView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.regions.Region;
import com.amazonaws.services.s3.model.ObjectMetadata;
import java.io.File;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
private static final int IMAGE_PICK_CODE = 1000;
private static final int VIDEO_PICK_CODE = 1001;
AmazonS3 s3Client;
Uri selectedImageUri, selectedVideoUri;
ImageView ivSelectedImage;
VideoView vvSelectedVideo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize AWS S3 client
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"Pool_Id", // Identity Pool ID
Regions.Region // Your region
);
BasicAWSCredentials credentials = new BasicAWSCredentials("Access_key", "Secret_key");
s3Client = new AmazonS3Client(credentialsProvider);
s3Client.setRegion(Region.getRegion(Regions.EU_NORTH_1));
ivSelectedImage = findViewById(R.id.ivSelectedImage);
vvSelectedVideo = findViewById(R.id.vvSelectedVideo);
Button btnSelectImage = findViewById(R.id.btnSelectImage);
Button btnSelectVideo = findViewById(R.id.btnSelectVideo);
Button btnSubmit = findViewById(R.id.btnSubmit);
// Handle Image Selection Button Click
btnSelectImage.setOnClickListener(v -> {
openImagePicker();
});
// Handle Video Selection Button Click
btnSelectVideo.setOnClickListener(v -> {
openVideoPicker();
});
// Handle Submit Button Click
btnSubmit.setOnClickListener(v -> {
if (selectedImageUri != null && selectedVideoUri != null) {
uploadFileToS3(Uri.fromFile(new File(getPathFromUri(selectedImageUri))), "image");
uploadFileToS3(Uri.fromFile(new File(getPathFromUri(selectedVideoUri))), "video");
} else {
Toast.makeText(MainActivity.this, "Please select an image and video", Toast.LENGTH_SHORT).show();
}
});
}
private void openImagePicker() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK_CODE);
}
private void openVideoPicker() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
intent.setType("video/*");
startActivityForResult(intent, VIDEO_PICK_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == IMAGE_PICK_CODE) {
selectedImageUri = data.getData();
ivSelectedImage.setImageURI(selectedImageUri);
} else if (requestCode == VIDEO_PICK_CODE) {
selectedVideoUri = data.getData();
vvSelectedVideo.setVideoURI(selectedVideoUri);
vvSelectedVideo.start();
}
}
}
public void uploadFileToS3(Uri fileUri, String category) {
try {
// Get InputStream from the file URI
InputStream inputStream = getContentResolver().openInputStream(fileUri);
if (inputStream == null) {
Toast.makeText(this, "Failed to open input stream for the file", Toast.LENGTH_SHORT).show();
return;
}
// Create metadata to handle file type and other info
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(getContentResolver().getType(fileUri)); // Set content type (e.g., image/jpeg)
// Generate a unique file name if needed
String fileName = category + "/" + System.currentTimeMillis() + "." + getFileExtension(fileUri);
// Upload the file to S3
PutObjectRequest putObjectRequest = new PutObjectRequest("testbucket3557", fileName, inputStream, metadata);
s3Client.putObject(putObjectRequest);
// Close the input stream
inputStream.close();
Toast.makeText(this, "File uploaded successfully", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private String getFileExtension(Uri uri) {
String extension = "";
String mimeType = getContentResolver().getType(uri);
if (mimeType != null) {
String[] parts = mimeType.split("/");
if (parts.length > 1) {
extension = parts[1]; // Extract file extension
}
}
return extension;
}
public String getPathFromUri(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(projection[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
return filePath;
} else {
return uri.getPath();
}
}
}
Это мой код mainActivity.java
А это файл AndroidManifest.xml
Я пытался редактировать разрешения, но ничего не помогло. Конкретная ошибка показана на изображении. Та же ошибка и для видео
введите здесь описание изображения
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -s3-bucket
1731494989
Anonymous
Итак, я создаю приложение, которое будет принимать вводимые пользователем данные и сохранять их в корзине s3. [code]package com.example.myapplication; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.widget.Button; import android.widget.ImageView; import android.widget.VideoView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.regions.Region; import com.amazonaws.services.s3.model.ObjectMetadata; import java.io.File; import java.io.InputStream; public class MainActivity extends AppCompatActivity { private static final int IMAGE_PICK_CODE = 1000; private static final int VIDEO_PICK_CODE = 1001; AmazonS3 s3Client; Uri selectedImageUri, selectedVideoUri; ImageView ivSelectedImage; VideoView vvSelectedVideo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize AWS S3 client CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( getApplicationContext(), "Pool_Id", // Identity Pool ID Regions.Region // Your region ); BasicAWSCredentials credentials = new BasicAWSCredentials("Access_key", "Secret_key"); s3Client = new AmazonS3Client(credentialsProvider); s3Client.setRegion(Region.getRegion(Regions.EU_NORTH_1)); ivSelectedImage = findViewById(R.id.ivSelectedImage); vvSelectedVideo = findViewById(R.id.vvSelectedVideo); Button btnSelectImage = findViewById(R.id.btnSelectImage); Button btnSelectVideo = findViewById(R.id.btnSelectVideo); Button btnSubmit = findViewById(R.id.btnSubmit); // Handle Image Selection Button Click btnSelectImage.setOnClickListener(v -> { openImagePicker(); }); // Handle Video Selection Button Click btnSelectVideo.setOnClickListener(v -> { openVideoPicker(); }); // Handle Submit Button Click btnSubmit.setOnClickListener(v -> { if (selectedImageUri != null && selectedVideoUri != null) { uploadFileToS3(Uri.fromFile(new File(getPathFromUri(selectedImageUri))), "image"); uploadFileToS3(Uri.fromFile(new File(getPathFromUri(selectedVideoUri))), "video"); } else { Toast.makeText(MainActivity.this, "Please select an image and video", Toast.LENGTH_SHORT).show(); } }); } private void openImagePicker() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult(intent, IMAGE_PICK_CODE); } private void openVideoPicker() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI); intent.setType("video/*"); startActivityForResult(intent, VIDEO_PICK_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == IMAGE_PICK_CODE) { selectedImageUri = data.getData(); ivSelectedImage.setImageURI(selectedImageUri); } else if (requestCode == VIDEO_PICK_CODE) { selectedVideoUri = data.getData(); vvSelectedVideo.setVideoURI(selectedVideoUri); vvSelectedVideo.start(); } } } public void uploadFileToS3(Uri fileUri, String category) { try { // Get InputStream from the file URI InputStream inputStream = getContentResolver().openInputStream(fileUri); if (inputStream == null) { Toast.makeText(this, "Failed to open input stream for the file", Toast.LENGTH_SHORT).show(); return; } // Create metadata to handle file type and other info ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(getContentResolver().getType(fileUri)); // Set content type (e.g., image/jpeg) // Generate a unique file name if needed String fileName = category + "/" + System.currentTimeMillis() + "." + getFileExtension(fileUri); // Upload the file to S3 PutObjectRequest putObjectRequest = new PutObjectRequest("testbucket3557", fileName, inputStream, metadata); s3Client.putObject(putObjectRequest); // Close the input stream inputStream.close(); Toast.makeText(this, "File uploaded successfully", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } } private String getFileExtension(Uri uri) { String extension = ""; String mimeType = getContentResolver().getType(uri); if (mimeType != null) { String[] parts = mimeType.split("/"); if (parts.length > 1) { extension = parts[1]; // Extract file extension } } return extension; } public String getPathFromUri(Uri uri) { String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(projection[0]); String filePath = cursor.getString(columnIndex); cursor.close(); return filePath; } else { return uri.getPath(); } } } [/code] Это мой код mainActivity.java [code] [/code] А это файл AndroidManifest.xml Я пытался редактировать разрешения, но ничего не помогло. Конкретная ошибка показана на изображении. Та же ошибка и для видео введите здесь описание изображения Подробнее здесь: [url]https://stackoverflow.com/questions/79184545/failing-image-video-upload-in-application-for-storing-it-in-aws-s3-bucket[/url]