androidで動画をListviewで再生するとエラーが起きます
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;
}
}
};
videoviewでも試しましたが同じような問題が起きました。
よろしくお願いします。