ДЕЙСТВИТЕЛЬНО Нужна помощь - Как прикрепить видео к электронному письму ??[2 новые проблемы] - PullRequest
2 голосов
/ 18 июля 2010

[ОБНОВЛЕНИЕ 2]: Привет еще раз,

после попытки прикрепить видео к электронному письму, я думаю (хотя и не уверен!), Что я немного ближе кмоя цель, но я обнаружил две проблемы ...

ПРОБЛЕМА 1: FILENAME НЕ ПОКАЗЫВАЕТСЯ ПРАВИЛЬНО : то, что я пытался, было вспомнить название видео, на которое я нажал, чтобы увидетькак я могу получить имя.Это то, что я сделал ...

vGrid.setOnItemClickListener(new OnItemClickListener() {

    @Override // click on item and open options menu
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        String [] proj={MediaStore.Video.Media.DATA};
        videocursor = managedQuery( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null,null,null); 
        video_column_index = videocursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
        videocursor.moveToPosition((int) vGrid.getSelectedItemId());
        // And here we get the filename
        String filename = videocursor.getString(video_column_index);
        Toast.makeText(ShareGalleryView.this, filename, Toast.LENGTH_SHORT).show();

        openOptionsMenu(); //Opens Options Menu by clicking on an item


        }
    });

... но вместо отображения только имени файла я получаю sdcard / filename.mp4, поэтому мой первый вопрос - как избавиться от "sdcard /«потому что, если я использую

videocursor.getString(video_column_index) в

i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),videocursor.getString(video_column_index))));

для прикрепления видео к почте, я получаю следующий вывод Logcat:

07-18 18:53:47.518: ERROR/Mms/media(179): java.io.FileNotFoundException: /sdcard/sdcard/Video0004.mp4 Это была проблема 1 ... теперь проблема 2

[ПРОБЛЕМА 2] Я также обнаружил, что независимо от того, на какой кнопке я нажимаю, вывод имени файла всегда одинаков ипоказывает только «sdcard / Video0004.mp4», поэтому, когда я нажимаю на Video0010, он также показывает «sdcard / Video0004.mp4», поэтому моя вторая проблема заключается в том, как мне убедиться в том, что в моем коде отображается элемент, на который был нажата также прикрепленный к электронной почте и всегда первое видео.

Пожалуйста, пожалуйста, помогите мне ... Это действительно сбивает меня с толку ... и сейчас у меня нет идеи, как решить эти проблемы.

Iвыложу весь код ниже ... Спасибо

package com.mobilevideoeditor.moved;

import java.io.File;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;


public class ShareGalleryView extends Activity {
    private Cursor videocursor;
    private int video_column_index;
    GridView vGrid;
    int count;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.videogrid);

        //create new Grid View
        vGrid=(GridView) findViewById(R.id.vgrid);
        registerForContextMenu(vGrid);
        vGrid.setAdapter(new VideoAdapter(this));

        init_phone_video_grid();

        vGrid.setOnItemClickListener(new OnItemClickListener() {

        @Override // click on item and open options menu
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

            String [] proj={MediaStore.Video.Media.DATA};
            videocursor = managedQuery( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null,null,null); 
            video_column_index = videocursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
            videocursor.moveToPosition((int) vGrid.getSelectedItemId());
            // And here we get the filename
            String filename = videocursor.getString(video_column_index);
            Toast.makeText(ShareGalleryView.this, filename, Toast.LENGTH_SHORT).show();

            openOptionsMenu(); //Opens Options Menu by clicking on an item


            }
        });

    }

    private void init_phone_video_grid() {
        System.gc();
        String[] proj = {
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.DISPLAY_NAME,
                MediaStore.Video.Media.DATA
        };

        videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null, null, null);
        count = videocursor.getCount();

        GridView vGrid=(GridView) findViewById(R.id.vgrid);
        vGrid.setAdapter(new VideoAdapter(this));

        }

    @Override //creates options menu with menu-items
    public boolean onCreateOptionsMenu(Menu menu) {

      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu_gallery_share, menu);
      return super.onCreateOptionsMenu(menu);
    }
    @Override //what happens when a menu item is clicked
    public boolean onOptionsItemSelected (MenuItem item){

         try{    
    //Facebook        
    if (item.getItemId() == R.id.menu_facebook)
        {
         //TODO open fb
        new AlertDialog.Builder(this)
          .setTitle("No Service")
          .setMessage("Sorry, Facebook is not supported yet!")
          .setNeutralButton("Close", new DialogInterface.OnClickListener() {                
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
            }}).show();
            return true;

        }
       //YouTube
        else if (item.getItemId() == R.id.menu_youtube)
        {
            //TODO open YouTube

            new AlertDialog.Builder(this)
              .setTitle("No Service")
              .setMessage("Sorry, YouTube is not supported yet!")
              .setNeutralButton("Close", new DialogInterface.OnClickListener() {                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                }}).show();

              return  true;
        }
        else if (item.getItemId() == R.id.menu_email)
        {

            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("text/plain");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.setType("video/mp4");
            i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),videocursor.getString(video_column_index))));
            startActivity(i);

            return true;

        }
        else if (item.getItemId() == R.id.menu_bluetooth)
        {
            // TODO send via bluetooth
            new AlertDialog.Builder(this)
              .setTitle("No Service")
              .setMessage("Sorry, Bluetooth is not supported yet!")
              .setNeutralButton("Close", new DialogInterface.OnClickListener() {                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                }}).show();
            return true;

        }

            }
         catch(Exception e)
            {
            e.printStackTrace();
            } 
              return super.onContextItemSelected(item);
    }


    public class VideoAdapter extends BaseAdapter {
        private Context vContext;

        public VideoAdapter(Context c) {
            vContext = c;
        }

        public int getCount() {
            return count;
        }

        public Object getItem(int position) {
            return null;
        }

        public long getItemId(int position) {
            return 0;
        }

        // create a new ImageView for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent) {
            System.gc();
              TextView tv = new TextView(vContext.getApplicationContext());
              String id = null;

              if (convertView == null) {
                    video_column_index = 
                    videocursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
                    videocursor.moveToPosition(position);
                    id = videocursor.getString(video_column_index);
                    tv.setText(id);
              } else
                    tv = (TextView) convertView;
              return tv;    
            }
        }  

}

Привет всем,

Я работаю над приложением Video, где вы можете нажать на видео с SD-карты,Это событие щелчка открывает меню (я использовал меню опций), которое предоставляет пользователю различные параметры обмена, например, электронную почту, Bluetooth и т. Д. Эта часть до сих пор работает нормально ... Что я сейчас пытаюсь сделать, это когда пользователь выбирает«Отправить по электронной почте» приложение должно открыть приложение электронной почты телефона через намерение (это также работает нормально) и должно непосредственно прикрепить видео, которое он щелкнул прежде, к новому письму.

[ОБНОВЛЕНИЕ] Последняя часть, где я застрял, потому что я не знаю, как получить имя файла изображения, по которому щелкнули, чтобы открыть изображение.Это часть в моем коде, где у меня возникла проблема (см. «НЕ ЗНАЮ, ЧТО СДЕЛАТЬ ЗДЕСЬ» )

1 Ответ

1 голос
/ 18 июля 2010

Вы не отслеживаете, по какому идентификатору видео кликают.

Как только вы это сделаете, вы можете (предположительно) получить путь к видео, запросив ContentProvider (как вы делаете в VideoAdapter). Или проще & ndash; поскольку вы уже запрашиваете MediaStore.Video.Media.DATA & mdash; прикрепите URL к представлению с помощью convertView.setTag().

Вы можете сохранить это в локальной переменной во время вызова onItemClick & mdash; URI должен быть доступен напрямую по телефону String uri = (String) v.getTag().

Некоторые дополнительные примечания:

  • Не вызывайте System.gc(), особенно в методе getView(). Это приведет к огромному количеству ненужных замедлений.
  • Не звоните vContext.getApplicationContext(); просто используйте vContext.
  • Вы неправильно перерабатываете просмотры. Ваш getView должен выглядеть примерно так:

private static int displayNameIndex = -1;

public View getView(int position, View convertView, ViewGroup parent) {
    TextView tv;

    if (convertView == null) {
        // Need to create a new view
        tv = new TextView(context);
    } else {
        // Otherwise, we can recycle the one given to us
        tv = (TextView) convertView;
    }

    // Bind cursor data to UI
    videocursor.moveToPosition(position);
    id = videocursor.getString(1); // column index of Media.DISPLAY_NAME
    tv.setText(id);

    // Bundle video URI into the view
    String videoUri = videocursor.getString(2); // column index of Media.DATA
    tv.setTag(videoUri);

    return tv;
}

Я бы также посмотрел на CursorAdapter, вместо того, чтобы выполнять курсоры самостоятельно (перемещать курсор в правильную позицию и т. Д.).

...