Передача имени файла намерению

Я новичок в Android и пытаюсь создать приложение, в котором есть средство выбора файлов и воспроизводит определенный файл. Мне удалось создать намерение для открытия файлов; однако я не могу передать путь к файлу из средства выбора файлов, чтобы открыть тот же конкретный файл. Код приведен ниже. Ценю любую помощь. Благодарю.

РЕДАКТИРОВАТЬ Добавление пропущенных строк ___

public class MainActivity extends ListActivity {
private List<String> item = null;
private List<String> path = null;
public String root = "/mnt/usbhost0";
public TextView myPath;


   @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myPath = (TextView) findViewById(R.id.path);
        getDir(root);
    }


    public void getDir(String dirPath)
    {
        myPath.setText("Location: " + dirPath);
        item = new ArrayList<String>();
        path = new ArrayList<String>();
        File f = new File(dirPath);
        File[] files = f.listFiles();
        if (!dirPath.equals(root))
        {
            item.add(root);
            path.add(root);
            item.add("../");
            path.add(f.getParent());
        }


        for (int i = 0; i < files.length; i++)
        {
            File file = files[i];
            path.add(file.getPath());
            if (file.isDirectory())
                item.add(file.getName() + "/");
            else
                item.add(file.getName());
        }

        ArrayAdapter<String> fileList =
                new ArrayAdapter<String>(this, R.layout.row, item);
        setListAdapter(fileList);
    }

    File file;


    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        File file = new File(path.get(position));
        if (file.isDirectory())
        {
            if (file.canRead())
                getDir(path.get(position));
            else
            {
                new AlertDialog.Builder(this)
                        .setIcon(R.drawable.icon)
                        .setTitle("[" + file.getName() + "] folder can't be read!")
                        .setPositiveButton("OK",
                                new DialogInterface.OnClickListener() {


                                    @Override

                                    public void onClick(DialogInterface dialog, int which) {
                                        // TODO Auto-generated method stub

                                    }

                                }).show();

            }

        } else

        {
            new AlertDialog.Builder(this)
                    .setIcon(R.drawable.icon)
                    .setTitle("Select")
                    .setMessage("Select " + file.getName() + " to play ?") //Send fileurl from here //
                    .setPositiveButton("Select", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            new DecryptTask().execute();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    }).show();


        }


    }

    void decrypt() throws IOException, NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException {
        File videoFile2Play = new File(//to here);
        Intent i = new Intent();
        i.setAction(android.content.Intent.ACTION_VIEW);
        i.setDataAndType(Uri.fromFile(videoFile2Play), "video/m4v");
        startActivity(i);
    }

    public class DecryptTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            try {
                decrypt();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}

РЕДАКТИРОВАТЬ 27 июля 2018

Обновил мой код в соответствии с предложением @ miguelarc, но все еще не могу передать имя. Вы указали какие-либо предложения или ошибки?


public class MainActivity extends ListActivity {
private List<String> item = null;
private List<String> path = null;
public String root = "/mnt/usbhost0";
public TextView myPath;


@Override

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myPath = (TextView) findViewById(R.id.path);
    getDir(root);
}


public void getDir(String dirPath)
{
    myPath.setText("Location: " + dirPath);
    item = new ArrayList<String>();
    path = new ArrayList<String>();
    File f = new File(dirPath);
    File[] files = f.listFiles();
    if (!dirPath.equals(root))
    {
        item.add(root);
        path.add(root);
        item.add("../");
        path.add(f.getParent());
    }


    for (int i = 0; i < files.length; i++)
    {
        File file = files[i];
        path.add(file.getPath());
        if (file.isDirectory())
            item.add(file.getName() + "/");
        else
            item.add(file.getName());
    }

    ArrayAdapter<String> fileList =
            new ArrayAdapter<String>(this, R.layout.row, item);
    setListAdapter(fileList);
}

File file;


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    final File file = new File(path.get(position));
    if (file.isDirectory())
    {
        if (file.canRead())
            getDir(path.get(position));
        else
        {
            new AlertDialog.Builder(this)
                    .setIcon(R.drawable.icon)
                    .setTitle("[" + file.getName() + "] folder can't be read!")
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {


                                @Override

                                public void onClick(DialogInterface dialog, int which) {
                                    // TODO Auto-generated method stub

                                }

                            }).show();

        }

    } else

    {
        new AlertDialog.Builder(this)
                .setIcon(R.drawable.icon)
                .setTitle("Select")
                .setMessage("Select " + file.getName() + " to play ?")
                .setPositiveButton("Select", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        new DecryptTask(file.getAbsolutePath()).execute();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }).show();


    }


}

void decrypt(String filePath) throws IOException, NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException {
    File extStore = Environment.getExternalStorageDirectory();
    File videoFile2Play = new File(file.getAbsolutePath());
    Intent i = new Intent();
    i.setAction(android.content.Intent.ACTION_VIEW);
    i.setDataAndType(Uri.fromFile(videoFile2Play), "video/*");
    startActivity(i);
}


public class DecryptTask extends AsyncTask<String, String, String> {
    ProgressDialog pd;
    String filePath;

    public DecryptTask(String filePath){
        this.filePath = filePath;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd = new ProgressDialog(MainActivity.this);
        pd.setMessage("Loading your video");
        pd.show();

    }




    @Override
    protected String doInBackground(String... params) {

        try {
            decrypt(this.filePath);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        pd.dismiss();
    }
}

}

Вы передали переменную root в метод onCreate (). Где вы декларировали и инициализировали root?

Taslim Oseni 23.07.2018 10:06

@Taslim извини, пропустил первые несколько строк

Lavin_38 23.07.2018 10:53

Надеюсь, этот решение может вам помочь.

user10041244 23.07.2018 11:52

в чем проблема в решении @ miguelarc?

Abhay Koradiya 27.07.2018 14:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
512
1

Ответы 1

Вы должны передать filePath в свою DecryptTask. Добавьте к нему конструктор и добавьте путь к файлу, чтобы вы могли инициализировать свой videoFile2Play с действительным путем. На данный момент ваш файл ничего не инициализирует, поэтому намерение ничего не запускает / не показывает.

Добавьте такой конструктор:

public class DecryptTask extends AsyncTask<String, String, String> {
    String filePath;

    public DecryptTask(String filePath){
        this.filePath = filePath;
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            decrypt(this.filePath); //<--- Add filePath as param of decrypt method
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

затем используйте путь к файлу, который вы получили внутри метода decrypt().

похоже, это не работает, я обновил свой вопрос обновленным кодом. любая помощь приветствуется. спасибо @miguelarc

Lavin_38 27.07.2018 14:26

@ Lavin_38 вы его отлаживали? Какое значение имеет this.filePath в методе decrypt (), вызываемом внутри метода doInBackground ()?

miguelarc 27.07.2018 15:46

Другие вопросы по теме