我想逐个上传多个图像,就像用户点击上传所有按钮一样,它必须从列表中可见的第一个图像开始,一旦第一个图像上传到服务器然后自动必须开始第二个上传但是之后一个或两个第二个间隔,对于列表中的所有可用图像都相同.
// btnUpload holder.uploadImageButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Upload startUpload(position); } });
我使用下面的代码,但它同时上传/同步所有图像,我的意思在一起,就像我在列表中有500个图像所以它上传所有500在一起,因此我在互联网连接断电时出现错误时间没有获得上传图像的准确状态!
private SparseBooleanArray flags = new SparseBooleanArray(); // At onClick,set all the flags to indicate that some data needs to be synced ImageButton buttonUploadAll = (ImageButton) findViewById(R.id.sync_btn); buttonUploadAll.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { for(int position=0; position<listView.getAdapter().getCount(); position++) { flags.put(position,true); } // Calling this would ensure a call to getView() on every // visible child of the listview. That is where we will check if // the data is to be synced and displayed or not ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } }); @Override // In getView of the listview's adapter public View getView(int position,View convertView,ViewGroup parent) { // If this item is to be synced if(flags.get(position)) { startUpload(); // Mark as synced flags.put(position,false); } // Rest of the method that draws the view.... }
这就是为什么我想逐个上传多个图像(以队列方式)
解决方法
我试着写一个服务,它将从共享的pref一个一个地上传图像:
注意:我hv硬编码这里的一些东西,如图像来自SD卡,所以路径是硬编码的,图像名称是硬编码的,所以PLZ适当地改变它并尝试下面的代码,我已经测试并为我工作
注意:我hv硬编码这里的一些东西,如图像来自SD卡,所以路径是硬编码的,图像名称是硬编码的,所以PLZ适当地改变它并尝试下面的代码,我已经测试并为我工作
下面的代码包含服务,活动[上传按钮,列表视图],xmlLayout,PHP服务,它将在ftp上传图像.
活动:
public class MainActivity extends Activity { SharedPreferences sharedPref; SharedPreferences.Editor editor; ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sharedPref = getSharedPreferences("myfiles",MODE_PRIVATE); editor = sharedPref.edit(); editor.putString("0","monika_pin.png"); editor.putString("1","monika_pin1.png"); editor.putString("2","monika_pin2.png"); editor.commit(); String[] arr = new String[] { "/mnt/sdcard/monika_pin.png","/mnt/sdcard/monika_pin1.png","/mnt/sdcard/monika_pin2.png" }; List<String> list = Arrays.asList(arr); MyAdapter adapter = new MyAdapter(this,R.layout.listitem_imv,list); listview = (ListView) findViewById(R.id.listView1); listview.setAdapter(adapter); } class MyAdapter extends ArrayAdapter<String> { List<String> mList; LayoutInflater mInflater; int mResource; public MyAdapter(Context context,int resource,List<String> objects) { super(context,resource,objects); mResource = resource; mInflater = getLayoutInflater(); mList = objects; } @Override public View getView(int position,ViewGroup parent) { View view; if (convertView == null) { view = mInflater.inflate(mResource,null); } else { view = convertView; } ImageView imageView = (ImageView) view .findViewById(R.id.imageView1); TextView textView = (TextView) view.findViewById(R.id.textView1); imageView.setTag(mList.get(position));// tag of imageView == path to // image new LoadImage(imageView).execute(); textView.setText(mList.get(position).toString()); return view; } } class LoadImage extends AsyncTask<Object,Void,Bitmap> { private ImageView imv; private String path; public LoadImage(ImageView imv) { this.imv = imv; this.path = imv.getTag().toString(); } @Override protected Bitmap doInBackground(Object... params) { Bitmap bitmap = null; // File file = new File( // Environment.getExternalStorageDirectory().getAbsolutePath() + // path); File file = new File(path); if (file.exists()) { bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { if (!imv.getTag().toString().equals(path)) { /* * The path is not same. This means that this image view is * handled by some other async task. We don't do anything and * return. */ return; } if (result != null && imv != null) { imv.setVisibility(View.VISIBLE); imv.setImageBitmap(result); } else { imv.setVisibility(View.GONE); } } } public void buttonClick(View view) { Intent intent = new Intent(this,MyService.class); startService(intent); } }
服务:
public class MyService extends Service { SharedPreferences sharedPref; SharedPreferences.Editor editor; int serverResponseCode = 0; String upLoadServerUri = null; private static final String TAG = "com.example.ServiceExample"; @Override public void onCreate() { Log.i(TAG,"Service onCreate"); sharedPref = getSharedPreferences("myfiles",MODE_PRIVATE); /************* PHP script path ****************/ upLoadServerUri = "http://myserver/uploadimage.PHP"; } @Override public int onStartCommand(Intent intent,int flags,int startId) { Log.i(TAG,"Service onStartCommand " + startId); final int currentId = startId; Runnable r = new Runnable() { public void run() { for (int i = 0; i < 3; i++) { // long endTime = System.currentTimeMillis() + 10*1000; // while (System.currentTimeMillis() < endTime) { synchronized (this) { try { uploadFile(sharedPref.getString(i + "","")); } catch (Exception e) { } } // } Log.i(TAG,"Service running " + currentId); } stopSelf(); } }; Thread t = new Thread(r); t.start(); return Service.START_STICKY; } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub Log.i(TAG,"Service onBind"); return null; } @Override public void onDestroy() { Log.i(TAG,"Service onDestroy"); } public int uploadFile(String sourceFileUri) { String fileName = sourceFileUri; HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead,bytesAvailable,bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; // File sourceFile = new // File(Environment.getExternalStorageDirectory(),sourceFileUri); File sourceFile = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/" + fileName); if (!sourceFile.isFile()) { return 0; } else { try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream( sourceFile); URL url = new URL(upLoadServerUri); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); // Allow Inputs conn.setDoOutput(true); // Allow Outputs conn.setUseCaches(false); // Don't use a Cached Copy conn.setRequestMethod("POST"); conn.setRequestProperty("Connection","Keep-Alive"); conn.setRequestProperty("ENCTYPE","multipart/form-data"); conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary); conn.setRequestProperty("uploaded_file",fileName); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); // dos.writeBytes("Content-Disposition: form-data; name="uploaded_file";filename=""+ fileName + """ // + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + fileName + "\"" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable,maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer,bufferSize); while (bytesRead > 0) { dos.write(buffer,bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable,maxBufferSize); bytesRead = fileInputStream.read(buffer,bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) serverResponseCode = conn.getResponseCode(); String serverResponseMessage = conn.getResponseMessage(); Log.i("uploadFile","HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); if (serverResponseCode == 200) { } // close the streams // fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { ex.printStackTrace(); Log.e("Upload file to server","error: " + ex.getMessage(),ex); } catch (Exception e) { e.printStackTrace(); Log.e("Upload file to server Exception","Exception : " + e.getMessage(),e); } return serverResponseCode; } // End else block } }
XmlLayout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.service.MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:onClick="buttonClick" android:text="Button" /> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/button1" android:layout_centerHorizontal="true" > </ListView> </RelativeLayout>
AndroidManifest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.service" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" /> </application> </manifest>
PHP脚本:
<?PHP $file_path = "uploads/"; $file_path = $file_path . basename( $_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$file_path)) { echo "success"; } else{ echo "fail"; } ?>
注意:确定在ftp上创建此PHP文件的位置,创建一个名为upload的文件夹,其中将上载所有文件
如果您想下载完整的源代码 – > Source Code