Launching a file using ACTION_VIEW Intent Action

2019-05-24 09:01发布

I have the following code to launch a file :

   try {
                    path = fileJsonObject.getString("filePath");
                     if (path.indexOf("/") == 0) {
                      path = path.substring(1, path.length()); 
                  }
                   path = root + path;
                   final File fileToOpen = new File(path);
                   if (fileToOpen.exists()) {
                      if (fileToOpen.isFile()) {
                             Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
                            myIntent.setData(Uri.parse(path));
                            final String pathToCheck = new String(path);
                            pathToCheck.toLowerCase();
                            if (pathToCheck.endsWith(".wav") || pathToCheck.endsWith(".ogg") || pathToCheck.endsWith(".mp3")
                                || pathToCheck.endsWith(".mid") || pathToCheck.endsWith(".midi") || pathToCheck.endsWith(".amr")) {
                            myIntent.setType("audio/*");
                        } else if (pathToCheck.endsWith(".mpg") || pathToCheck.endsWith(".mpeg") || pathToCheck.endsWith(".3gp")
                                || pathToCheck.endsWith(".mp4")) {
                            myIntent.setType("video/*");
                        } else if (pathToCheck.endsWith(".jpg") || pathToCheck.endsWith(".jpeg") || pathToCheck.endsWith(".gif")
                                || pathToCheck.endsWith(".png") || pathToCheck.endsWith(".bmp")) {
                            myIntent.setType("image/*");
                        } else if (pathToCheck.endsWith(".txt") || pathToCheck.endsWith(".csv") || pathToCheck.endsWith(".xml")) {
                            Log.i("txt","Text fileeeeeeeeeeeeeeeeeeeeeeeeee");
                            myIntent.setType("text/*");
                        } else if (pathToCheck.endsWith(".gz") || pathToCheck.endsWith(".rar") || pathToCheck.endsWith(".zip")) {
                            myIntent.setType("package/*");
                        } else if (pathToCheck.endsWith(".apk")) {
                            myIntent.setType("application/vnd.android.package-archive");
                        }
                             ((Activity) context).startActivityForResult(myIntent, RequestCodes.LAUNCH_FILE_CODE);
                    } else {
                        errUrl = resMsgHandler.errMsgResponse(fileJsonObject,
                        "Incorrect path provided. please give correct path of file");

                        return errUrl;
                    }
                } else {
                    errUrl = resMsgHandler.errMsgResponse(fileJsonObject,"Incorrect path provided. please give correct path of file");

                    return errUrl;
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.i("err","Unable to launch file" + " " + e.getMessage());
                errUrl = resMsgHandler.errMsgResponse(fileJsonObject,
                "Unable to launch file" + " " + e.getMessage());
                return errUrl;
                }  


 @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
       super.onActivityResult(requestCode, resultCode, data);
         try {

   if (requestCode == RequestCodes.LAUNCH_FILE_CODE) {
            if (resultCode == RESULT_CANCELED) {
                     Log.i("err","errrrrrrrrrrrrrrrrrrrrrrrrrrrrrr");
                       String errUrl = responseMsgHandler.errMsgResponse(FileHandler.fileJsonObject, "Unable to launch file");
                mWebView.loadUrl(errUrl);
                } else if (resultCode == RESULT_OK) {
                String successUrl =         responseMsgHandler.launchfileResponse(FileHandler.fileJsonObject);
                mWebView.loadUrl(successUrl);
            }  

Amd the result ctrl is at "if (resultCode == RESULT_CANCELED)". So how to successfully launch this?

May be in short i am doing this:

final File fileToOpen = new File(path);  
 if (fileToOpen.exists()) {  
 if (fileToOpen.isFile()) {  
Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);  
myIntent.setData(Uri.parse(path));  

    if (pathToCheck.endsWith(".txt") || pathToCheck.endsWith(".csv") || pathToCheck.endsWith(".xml"))    {     
                                Log.i("txt","Text fileeeeeeeeeeeeeeeeeeeeeeeeee");  
                                    myIntent.setType("text/*");
  startActivityForResult(myIntent, RequestCodes.LAUNCH_FILE_CODE);  

and

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
         super.onActivityResult(requestCode, resultCode, data);
 if (requestCode == RequestCodes.LAUNCH_FILE_CODE) {  
                if (resultCode == RESULT_CANCELED) {  
                Log.i  ("err","errrrrrrrrrrrrrrrrrrrrrrrrrrrrrr");
                   String errUrl = responseMsgHandler.errMsgResponse(FileHandler.fileJsonObject, "Unable to launch file");  
                    mWebView.loadUrl(errUrl);   
            }    else if (resultCode == RESULT_OK) {
                    String successUrl = responseMsgHandler.launchfileResponse(FileHandler.fileJsonObject);
                     mWebView.loadUrl(successUrl);  
                }  

My err log:

    04-04 12:33:08.635: ERROR/AndroidRuntime(3757): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cooliris.media/com.cooliris.media.Gallery}: java.lang.NullPointerException  

    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)  
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)  
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)  
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)   
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.os.Handler.dispatchMessage(Handler.java:99)  
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.os.Looper.loop(Looper.java:123)  
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.main(ActivityThread.java:4627)  
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at java.lang.reflect.Method.invokeNative(Native Method)  
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at java.lang.reflect.Method.invoke(Method.java:521)  
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)  
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at dalvik.system.NativeStart.main(Native Method)
   04-04 12:33:08.635: ERROR/AndroidRuntime(3757): Caused by: java.lang.NullPointerException
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at com.cooliris.media.Gallery.onCreate(Gallery.java:305) 
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)  
    04-04 12:33:08.635: ERROR/AndroidRuntime(3757):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)  

Thanks
Sneha

2条回答
Bombasti
2楼-- · 2019-05-24 09:20

try this

if (item_ext.equalsIgnoreCase(".mp3") || 
                 item_ext.equalsIgnoreCase(".m4a")||
                 item_ext.equalsIgnoreCase(".mp4")) {

            if(mReturnIntent) {
                returnIntentResults(file);
            } else {
                Intent i = new Intent();
                i.setAction(android.content.Intent.ACTION_VIEW);
                i.setDataAndType(Uri.fromFile(file), "audio/*");
                startActivity(i);
            }
        }

        /*photo file selected*/
        else if(item_ext.equalsIgnoreCase(".jpeg") || 
                item_ext.equalsIgnoreCase(".jpg")  ||
                item_ext.equalsIgnoreCase(".png")  ||
                item_ext.equalsIgnoreCase(".gif")  || 
                item_ext.equalsIgnoreCase(".tiff")) {

            if (file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent picIntent = new Intent();
                    picIntent.setAction(android.content.Intent.ACTION_VIEW);
                    picIntent.setDataAndType(Uri.fromFile(file), "image/*");
                    startActivity(picIntent);
                }
            }
        }

        /*video file selected--add more video formats*/
        else if(item_ext.equalsIgnoreCase(".m4v") || 
                item_ext.equalsIgnoreCase(".3gp") ||
                item_ext.equalsIgnoreCase(".wmv") || 
                item_ext.equalsIgnoreCase(".mp4") || 
                item_ext.equalsIgnoreCase(".ogg") ||
                item_ext.equalsIgnoreCase(".wav")) {

            if (file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent movieIntent = new Intent();
                    movieIntent.setAction(android.content.Intent.ACTION_VIEW);
                    movieIntent.setDataAndType(Uri.fromFile(file), "video/*");
                    startActivity(movieIntent);
                }
            }
        }

        /*zip file */
        else if(item_ext.equalsIgnoreCase(".zip")) {

            if(mReturnIntent) {
                returnIntentResults(file);

            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                AlertDialog alert;
                mZippedTarget = mFileMag.getCurrentDir() + "/" + item;
                CharSequence[] option = {"Extract here", "Extract to..."};

                builder.setTitle("Extract");
                builder.setItems(option, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        switch(which) {
                            case 0:
                                String dir = mFileMag.getCurrentDir();
                                mHandler.unZipFile(item, dir + "/");
                                break;

                            case 1:
                                mDetailLabel.setText("Holding " + item + 
                                                     " to extract");
                                mHoldingZip = true;
                                break;
                        }
                    }
                });

                alert = builder.create();
                alert.show();
            }
        }

        /* gzip files, this will be implemented later */
        else if(item_ext.equalsIgnoreCase(".gzip") ||
                item_ext.equalsIgnoreCase(".gz")) {

            if(mReturnIntent) {
                returnIntentResults(file);

            } else {
                //TODO:
            }
        }

        /*pdf file selected*/
        else if(item_ext.equalsIgnoreCase(".pdf")) {

            if(file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent pdfIntent = new Intent();
                    pdfIntent.setAction(android.content.Intent.ACTION_VIEW);
                    pdfIntent.setDataAndType(Uri.fromFile(file), 
                                             "application/pdf");

                    try {
                        startActivity(pdfIntent);
                    } catch (ActivityNotFoundException e) {
                        Toast.makeText(this, "Sorry, couldn't find a pdf viewer", 
                                Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

        /*Android application file*/
        else if(item_ext.equalsIgnoreCase(".apk")){

            if(file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent apkIntent = new Intent();
                    apkIntent.setAction(android.content.Intent.ACTION_VIEW);
                    apkIntent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                    startActivity(apkIntent);
                }
            }
        }

        /* HTML file */
        else if(item_ext.equalsIgnoreCase(".html")) {

            if(file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent htmlIntent = new Intent();
                    htmlIntent.setAction(android.content.Intent.ACTION_VIEW);
                    htmlIntent.setDataAndType(Uri.fromFile(file), "text/html");

                    try {
                        startActivity(htmlIntent);
                    } catch(ActivityNotFoundException e) {
                        Toast.makeText(this, "Sorry, couldn't find a HTML viewer", 
                                            Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

        /* text file*/
        else if(item_ext.equalsIgnoreCase(".txt")) {

            if(file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent txtIntent = new Intent();
                    txtIntent.setAction(android.content.Intent.ACTION_VIEW);
                    txtIntent.setDataAndType(Uri.fromFile(file), "text/plain");

                    try {
                        startActivity(txtIntent);
                    } catch(ActivityNotFoundException e) {
                        txtIntent.setType("text/*");
                        startActivity(txtIntent);
                    }
                }
            }
        }

        /* generic intent */
        else {
            if(file.exists()) {
                if(mReturnIntent) {
                    returnIntentResults(file);

                } else {
                    Intent generic = new Intent();
                    generic.setAction(android.content.Intent.ACTION_VIEW);
                    generic.setDataAndType(Uri.fromFile(file), "text/plain");

                    try {
                        startActivity(generic);
                    } catch(ActivityNotFoundException e) {
                        Toast.makeText(this, "Sorry, couldn't find anything " +
                                       "to open " + file.getName(), 
                                       Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

resultCode must equal RESULT_CANCELED because the only way out of that activity is pressing the back button on the phone this publishes a canceled result code not an ok result code

查看更多
淡お忘
3楼-- · 2019-05-24 09:23

I think for that intent you are not setting the result like

youractivity.setResult(Activity.RESULT_OK)

in your case may be youractivity.setResult(RESULT_OK) before startactivityforresult(intent)

查看更多
登录 后发表回答