Issue
My problem is that after creating an Intent and making the user select videos my activityOnResult method is supposed to get the file path of the selected videos from their uri which it does then afterward a for loop is supposed to run which loops through the lists of the selected videos path and assign them to a file which I plan to rename to a hidden directory I created.
But the problem is that the for loop doesn't run I think because I placed an alert dialog after the for loop and got a random item from the list of selected videos and it runs but the for loop doesn't.
Here is my Activity
package com.memoir.premium.code.activities;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.memoir.premium.code.R;
import android.support.design.widget.*;
import android.support.v4.view.*;
import com.memoir.premium.code.fragments.*;
import android.support.v4.app.*;
import java.util.*;
import android.view.*;
import android.os.*;
import android.content.*;
import java.io.*;
import android.provider.*;
import android.net.*;
import android.database.*;
import android.util.*;
import android.annotation.*;
import android.widget.*;
import android.*;
import android.content.pm.*;
import cn.pedant.SweetAlert.*;
import java.nio.file.*;
public class ImportResourcesActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.video_icon,
R.drawable.image_icon
};
private FloatingActionButton fab_add;
private static final String TAG = "VideoPickerActivity";
private static final int SELECT_VIDEOS = 1;
private static final int SELECT_VIDEOS_KITKAT = 1;
int REQUEST_CODE_SELECT_VIDEOS = 1;
private List<String> selectedVideos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.import_resources_activity);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
fab_add = findViewById(R.id.fab_add);
fab_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkPermission();
}
});
}
public void checkPermission(){
if(this!=null){
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
selectMultipleVideos();
}
else {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},100);
}}
}
private void selectMultipleVideos() {
/* Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEOS);*/
if (Build.VERSION.SDK_INT <19){
Intent intent = new Intent();
intent.setType("video/mp4");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select videos"),REQUEST_CODE_SELECT_VIDEOS);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("video/mp4");
startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEOS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==100 && (grantResults.length>0) && (grantResults[0]==PackageManager.PERMISSION_GRANTED) && (grantResults[1]==PackageManager.PERMISSION_GRANTED)){
//When permission granted
if (Build.VERSION.SDK_INT <19){
Intent intent = new Intent();
intent.setType("video/mp4");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select videos"),REQUEST_CODE_SELECT_VIDEOS);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("video/mp4");
startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEOS);
}
}
else {
new SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE)
.setTitleText("Alert")
.setContentText("App cannot function without you granting this permission so please grant it")
.show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (resultCode == RESULT_OK) {
selectedVideos = getSelectedVideos(requestCode,data);
for(int i = 0;selectedVideos.size()< i;i++){
File vidFile = new File(selectedVideos.get(i));
vidFile.renameTo(new File(Environment.getExternalStorageDirectory()+File.separator+"."+"memories/videos/"+vidFile.getName()));
showToast("Sucess "+vidFile.getName());
}
new SweetAlertDialog(this, SweetAlertDialog.NORMAL_TYPE)
.setTitleText("Sir Micah")
.setContentText("It returned an intent" + selectedVideos.get(0))
.show();
}
}
/*@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SELECT_VIDEOS && resultCode == RESULT_OK) {
if (data != null) {
if (data.getClipData() != null) {
// Multiple videos were selected
int count = data.getClipData().getItemCount();
for (int i = 0; i < count; i++) {
Uri videoUri = data.getClipData().getItemAt(i).getUri();
// Process the selected video Uri
//File vidFile = convertUriToFile(videoUri);
//vidFile.renameTo(new File(Environment.getExternalStorageDirectory()+File.separator+"."+"memories/videos/"+vidFile.getName()));
showToast("Sucess "+i);
}
} else if (data.getData() != null) {
// Single video was selected
Uri videoUri = data.getData();
// Process the selected video Ur
//File vidFile = convertUriToFile(videoUri);
//vidFile.renameTo(new File(Environment.getExternalStorageDirectory()+File.separator+"."+"memories/videos/"+vidFile.getName()));
showToast("Sucess "+videoUri);
}
}
}
}*/
/*private File convertUriToFile(Uri uri) {
String filePath = null;
String[] projection = {MediaStore.Video.Media.DATA};
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
filePath = cursor.getString(columnIndex);
cursor.close();
}
if (filePath != null) {
return new File(filePath);
} else {
return null;
}
}
public String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}*/
/*private List<String> getSelectedVideos(Intent data) {
List<String> result = new ArrayList<>();
String[] filePathColumn = { MediaStore.Video.Media.DATA };
// Single video selected
if(data.getData() != null){
Uri mImageUri = data.getData();
// Get the cursor
Cursor cursor = getContentResolver().query(mImageUri,
filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String videoPath = cursor.getString(columnIndex);
if(videoPath == null)
Log.e(TAG, "videoPath is null");
result.add(videoPath);
cursor.close();
}
// Multiple videos selected
else {
ClipData mClipData = data.getClipData();
if (mClipData != null) {
for (int i = 0; i < mClipData.getItemCount(); i++) {
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
// Get the cursor
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// Move to first row
if (cursor == null)
Log.e(TAG, "cursor is null");
else {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
String videoPath = cursor.getString(columnIndex);
if(videoPath == null)
Log.e(TAG, "videoPath is null");
result.add(videoPath);
} else {
Log.e(TAG, "cannot use cursor");
}
cursor.close();
}
}
}
}
return result;
}*/
private List<String> getSelectedVideos(int requestCode, Intent data) {
List<String> result = new ArrayList<>();
ClipData clipData = data.getClipData();
if(clipData != null) {
for(int i=0;i<clipData.getItemCount();i++) {
ClipData.Item videoItem = clipData.getItemAt(i);
Uri videoURI = videoItem.getUri();
String filePath = getPath(this, videoURI);
result.add(filePath);
}
}
else {
Uri videoURI = data.getData();
String filePath = getPath(this, videoURI);
result.add(filePath);
}
return result;
}
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
@SuppressLint("NewApi")
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
public void showToast(String str){
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
}
private void setupTabIcons() {
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new Videos(), "VIDEOS");
adapter.addFragment(new Images(), "IMAGES");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
Here is the ActivityOnResult from the above activity
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (resultCode == RESULT_OK) {
selectedVideos = getSelectedVideos(requestCode,data);
for(int i = 0;selectedVideos.size()< i;i++){
File vidFile = new File(selectedVideos.get(i));
vidFile.renameTo(new File(Environment.getExternalStorageDirectory()+File.separator+"."+"memories/videos/"+vidFile.getName()));
showToast("Sucess "+vidFile.getName());
}
new SweetAlertDialog(this, SweetAlertDialog.NORMAL_TYPE)
.setTitleText("Sir Micah")
.setContentText("It returned an intent data" + selectedVideos.get(0))
.show();
}
}
Here is a pic of what happens when I select the videos,after it returns to the app the alert dialog runs showing me that the path is not null but the for loop does not rename the file to my hidden directory.
Solution
You can select the multiple video by following code and on Activity result get the uri of file
private void selectMultipleVideos() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEOS);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SELECT_VIDEOS && resultCode == RESULT_OK) {
if (data != null) {
if (data.getClipData() != null) {
// Multiple videos were selected
int count = data.getClipData().getItemCount();
for (int i = 0; i < count; i++) {
Uri videoUri = data.getClipData().getItemAt(i).getUri();
// Process the selected video Uri
}
} else if (data.getData() != null) {
// Single video was selected
Uri videoUri = data.getData();
// Process the selected video Uri
}
}
}
}
private File convertUriToFile(Uri uri) {
String filePath = null;
String[] projection = {MediaStore.Video.Media.DATA};
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
filePath = cursor.getString(columnIndex);
cursor.close();
}
if (filePath != null) {
return new File(filePath);
} else {
return null;
}
}
Let me know if you have any doubts
Answered By - Yogesh Rewani
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.