You need to set manifest file first to enable file permissions.
Here is my AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".PdfprintdemoActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> </manifest>
I put everything inside one activity to make this example simple. There are some important elements that need to be explained.
OnCreate method: It calls this method when creating the view. You should call the base method first then do your overrides.
/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { //call base super.onCreate(savedInstanceState); //set layout main.xml to be layout for this activity setContentView(R.layout.main); //create references to the controls startBtn = (Button) findViewById(R.id.startBtn); //attach listener in code or you can do that in layout file. startBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { startDownload(); } }); }
I used Async task to handle the download. It helps you to performasynchronous work on your user interface without halting the UI. You don't needto handle threads by yourself.
- doInBackground() executes automatically on a worker thread if you call "execute" method from this class.
- onPreExecute(), onPostExecute(), onProgressUpdate() are all invoked on the UI thread.
- You can set the return value from the "doInBackround()" as input to onPostExecute()
- You can access publishProgress() from "doInBackround()" method to call "onProgressUpdate()"
We are setting the dialog at onPreExecute():
@Override protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_PROGRESS); } //do actual download @Override protected String doInBackground(String... aurl) { int count; String fullpath = ""; try { URL url = new URL(aurl[0]); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); //Get directory File root = Environment.getExternalStorageDirectory(); InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(new File(root, aurl[1])); byte data[] = new byte[1024]; fullpath = root.getAbsolutePath()+"/"+aurl[1]; Log.d("ANDRO_ASYNC","path:"+fullpath); long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress("" + (int) ((total * 100) / lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); Log.d("ANDRO_ASYNC", "File closed1: " + lenghtOfFile); } catch (Exception e) { Log.d("error",e.getMessage()); } return fullpath; }
/*We use this method to update progress bar*/ protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC", progress[0]); mProgressDialogWindow.setProgress(Integer.parseInt(progress[0])); } /* This method takes the return param from doinbackground call as input*/ @Override protected void onPostExecute(String linkname) { mProgressDialogWindow.setMessage("Finished"); dismissDialog(DIALOG_DOWNLOAD_PROGRESS); Log.d("onPostExecute","Send:"+linkname); OpenFile(linkname); } /*We are firing intent to open this file with avaialble pdf viewer*/ protected void OpenFile(String linkname) { File file = new File(linkname); if (file.exists()) { Log.d("OpenFile","Exists:"+linkname); Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(PdfprintdemoActivity.this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); } }else { Log.d("OpenFile","DOES NOT Exists:"+linkname); } }
No comments:
Post a Comment
Hey!
Let me know what you think?