您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
39_视频客户端综合案例&界面的显示
发布时间:2021-02-23 16:19:20编辑:雪饮阅读()
纠正xml接口
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_item"
android:layout_width="80sp"
android:layout_height="60sp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="标题"
android:textColor="@android:color/black"
android:textSize="16sp" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放时间"
android:textColor="@android:color/darker_gray"
android:textSize="10sp" />
<TextView
android:layout_marginLeft="30dip"
android:id="@+id/tv_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放次数 "
android:textColor="@android:color/darker_gray"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
然后由于图片的下载涉及到文件存储权限、获取本地图片又涉及到文件读取权限,所以清单文件中如下两个配置还是要加的,则如AndroidManifest.xml:
不过有感觉这个读取权限不需要加,不过就是懒得尝试了取消后会不会成功读取。
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.InputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView lv;
private List<Channel> channels;
private LayoutInflater inflater;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化充气泵
inflater = LayoutInflater.from(this);
lv = this.findViewById(R.id.lv);
String address = getResources().getString(R.string.serverurl);
try {
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
InputStream is = NetUtil.getChannelStream(address);
channels = ChannelService.getChannels(is);
} catch (Exception e) {
Toast.makeText(this, "获取数据失败", 0).show();
e.printStackTrace();
}
lv.setAdapter(new MyAdapter());
//实现视图点击,获取对应item的id
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Channel chanel = (Channel) lv.getItemAtPosition(position);
String channelid = chanel.getId();
Toast.makeText(MainActivity.this, "提交 "+channelid+"到服务器", 0).show();
}
});
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return channels.size();
}
@Override
public Object getItem(int position) {
return channels.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = inflater.inflate(R.layout.item, null);
Channel channel = channels.get(position);
ImageView iv_item = (ImageView) view.findViewById(R.id.iv_item);
TextView tv_count = (TextView) view.findViewById(R.id.tv_count);
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_time = (TextView) view.findViewById(R.id.tv_time);
tv_count.setText("点播次数 " + channel.getCount());
tv_name.setText(channel.getName());
tv_time.setText("播放时间 " + channel.getTime());
//获取图片并缓存
String address = channel.getIcon();
int start = address.lastIndexOf("/");
String iconname = address.substring(start + 1, address.length());
File file = new File(Environment.getExternalStorageDirectory(),
iconname);
if (file.exists() && file.length() > 0) {// 如果存在 就直接使用 sd卡的文件
iv_item.setImageURI(Uri.fromFile(file));
System.out.println("使用缓存");
} else {
// 如果不存在 才去下载网络上的图片
try {
Bitmap bitmap = ImageUtil.getImage(address);
iv_item.setImageBitmap(bitmap);
System.out.println("下载新的图片");
} catch (Exception e) {
e.printStackTrace();
iv_item.setImageResource(R.drawable.default_icon);
}
}
return view;
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.youku">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Youku"
android:usesCleartextTraffic="true"
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
依赖中的 Channel.java:
package com.example.youku;
public class Channel {
private String id;
private String name;
private String time;
private int count ;
private String icon ;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
}依赖中的NetUtil.java:
package com.example.youku;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class NetUtil {
/**
* 获取服务器频道信息返回回来的输入流
* @param address 频道信息的jsp或者servlet的地址
* @return inputstream
*/
public static InputStream getChannelStream (String address) throws Exception{
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int code = conn.getResponseCode() ;
if(code == 200){
return conn.getInputStream();
}
return null;
}
}依赖中的ImageUtil.java:
package com.example.youku;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
public class ImageUtil {
/**
* 获取网络address地址对应的图片
* @param address
* @return bitmap的类型
*/
public static Bitmap getImage(String address) throws Exception{
//通过代码 模拟浏览器访问图片流程
// http://xxx.xxx/a.jpg
int start = address.lastIndexOf("/");
String iconname = address.substring(start+1, address.length());
File file = new File(Environment.getExternalStorageDirectory(),iconname);
FileOutputStream fos = new FileOutputStream(file);
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
//获取服务器返回回来的流
InputStream is = conn.getInputStream();
byte[] result = StreamTool.getBytes(is);
//把图片信息 保存到sd卡
fos.write(result);
fos.flush();
fos.close();
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
return bitmap;
}
}依赖中的StreamTool.java:
package com.example.youku;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class StreamTool {
/**
* 把一个inputstream里面的内容转化成一个byte[]
*/
public static byte[] getBytes(InputStream is) throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){
bos.write(buffer, 0, len);
}
is.close();
bos.flush();
byte[] result = bos.toByteArray();
System.out.println(new String(result));
return result;
}
}其它没有提到的依赖,都还是保持上次用的依赖,那么接下来就部署到设备上看看效果了,显然是很ok的了
也可以看到缓存是使用成功的。
关键字词:android,网络图片