0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

質問です。androidで動画をListviewで再生するとエラーが起きます。

Posted at

androidのアプリをjavaでandroidstudioで作成しています。
googlemapをタップすると周辺10㎞のツイートを表示するというアプリです。
問題点
取得したツイートをListviewに表示する際、動画を表示させたいのですが
・該当のツイートではないのに動画が表示される
・動画を表示させると落ちる
・listviewを戻しても動画が再生されない。
という問題が起きます。
SurfaceView、mediaplayerを使用して動画を再生しています。
解決方法をよろしくお願い致します。

以下のコード
public class MapsSubActivity extends ListActivity {

private TweetAdapter01 mAdapter;
private Twitter mTwitter;
public SurfaceView mSurfaceView;
public SurfaceHolder mHolder;
public MediaPlayer mMediaPlayer;
public String path1 = "";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mAdapter = new TweetAdapter01(this);
    reloadTimeLine();
    setListAdapter(mAdapter);
}


private void reloadTimeLine() {
    AsyncTask<Void, Void, List<Status>> task = new AsyncTask<Void, Void, List<twitter4j.Status>>() {



        //経度緯度の受け渡し
        Intent intent = getIntent();
        String strLat = intent.getStringExtra("strLat");//除外ワード
        String strLong = intent.getStringExtra("strLong");//アカウントを指定
        double dLat = Double.parseDouble(strLat);
        double dLong = Double.parseDouble(strLong);


        public final String API_KEY = "XXXXXXX";
        public final String API_SECRET = "XXXXXXX";
        public final String ACCESS_TOKEN = "XXXXXXX";
        public final String ACCESS_TOKEN_SECRET = "XXXXXXX";

        @Override
        protected List<twitter4j.Status> doInBackground(Void... params) {
            try {


                String strQuery = null;
                Twitter tw = new TwitterFactory().getInstance();
                tw.setOAuthConsumer(API_KEY, API_SECRET);
                AccessToken at = new AccessToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
                tw.setOAuthAccessToken(at);
                ArrayList<twitter4j.Status> list = new ArrayList<twitter4j.Status>();
                Query query = new Query();                  
                    query.setCount(100);
                    GeoLocation geo = new GeoLocation(dLat, dLong);
                    query.setGeoCode(geo, 10.0, Query.KILOMETERS);
                    query.setQuery(strQuery);
                    QueryResult result = tw.search(query);
                    String str = String.valueOf(result.getCount());

                    for (twitter4j.Status tweet : result.getTweets()) {
                        list.add(tweet);
                    }
                    if (result.hasNext()) {
                        query = result.nextQuery();
                    } 
                return list;
            } catch(TwitterException e){
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(List<twitter4j.Status> result) {
            if (result != null) {
                mAdapter.clear();
                for (twitter4j.Status status : result) {
                    mAdapter.add(status);
                    Log.d("testE","zoku");
                }
                getListView().setSelection(0);
            } else {
            }
        }
    };
    task.execute();
}

private class TweetAdapter01 extends ArrayAdapter<Status> {

    private LayoutInflater mInflater;

    public TweetAdapter01(Context context) {
        super(context, android.R.
                layout.simple_list_item_1);
        mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = mInflater.inflate(R.layout.list_item_searchsub, null);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_searchsub, null);
        }

        Status item = getItem(position);
        SmartImageView icon = (SmartImageView) convertView.findViewById(R.id.icon);
        icon.setImageUrl(item.getUser().getProfileImageURL());
        Log.d("testItem",item.getUser().getProfileImageURL());
        TextView name = (TextView) convertView.findViewById(R.id.name);
        name.setText(item.getUser().getName());
        TextView screenName = (TextView) convertView.findViewById(R.id.screen_name);
        screenName.setText("@" + item.getUser().getScreenName());
        TextView text = (TextView) convertView.findViewById(R.id.text);
        text.setText(item.getText());
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        SmartImageView image1 = (SmartImageView) convertView.findViewById(R.id.image1);
        SmartImageView image2 = (SmartImageView) convertView.findViewById(R.id.image2);
        SmartImageView image3 = (SmartImageView) convertView.findViewById(R.id.image3);
        SmartImageView image4 = (SmartImageView) convertView.findViewById(R.id.image4);
        image1.setVisibility(INVISIBLE);
        image2.setVisibility(INVISIBLE);
        image3.setVisibility(INVISIBLE);
        image4.setVisibility(INVISIBLE);

        ExtendedMediaEntity[] mediaEntitys = item.getExtendedMediaEntities();


        List list = new ArrayList();
        for( int i = 0; i < mediaEntitys.length; i ++ ){
            ExtendedMediaEntity extendedMediaEntity = mediaEntitys[i];
            ExtendedMediaEntity.Variant[] variant = extendedMediaEntity.getVideoVariants();
            if (extendedMediaEntity.getType().equals("video")) {
                    list.add(variant[i].getUrl());
            }
            else{list.add(extendedMediaEntity.getMediaURLHttps());}
        }


        String[] medias = ( String[] )list.toArray( new String[0] );
        for (int i=0;i < medias.length;i++) {
            if(i==0) {
                if (medias[i].contains("video")) {

                    mSurfaceView.setVisibility(VISIBLE);
                    // Windowを透明にする
                    getWindow().setFormat(PixelFormat.TRANSPARENT);
                    // SurfaceViewにコールバックを設定
                    path1 = null;
                    path1 = medias[i];
                    mHolder = mSurfaceView.getHolder();
                    mHolder.addCallback(mCallback);

                }
                //
                else {
                    image1.setVisibility(VISIBLE);
                    image1.setImageUrl(medias[i]);
                    Log.d("test201804", medias[i]);
                }
            }
            if(i==1){
                image2.setVisibility(VISIBLE);
                image2.setImageUrl(medias[i]);
                Log.d("test201804",medias[i]);
            }
            if(i==2){
                image3.setVisibility(VISIBLE);
                image3.setImageUrl(medias[i]);
                Log.d("test201804",medias[i]);
            }
            if(i==3){
                image4.setVisibility(VISIBLE);
                image4.setImageUrl(medias[i]);
                Log.d("test201804",medias[i]);
            }

        }

        return convertView;
    }
}



private final SurfaceHolder.Callback mCallback = new SurfaceHolder.Callback() {


    /** SurfaceViewが生成された時に呼び出される */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
     //   public final String path = "ファイルパスかURL";
        try {

            // MediaPlayerを生成
            mMediaPlayer = new MediaPlayer();
            // 動画ファイルをMediaPlayerに読み込ませる
         //   Log.d("mediaplayertest",path1);

            mMediaPlayer.setDataSource(path1);
            // 読み込んだ動画ファイルを画面に表示する
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnPreparedListener(new MediaPlayer. OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mMediaPlayer.start();
                }
            });
           // mMediaPlayer.start();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();

        } catch (SecurityException e) {
            e.printStackTrace();

        } catch (IllegalStateException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();

        } finally {

        }
    }

    //
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    /** SurfaceViewが終了した時に呼び出される */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;

            mSurfaceView.setVisibility(INVISIBLE);
            path1 = null;
        }
    }

};

}

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?