Phonegap - 如何在创建文件后触发媒体扫描程序

时间:2013-10-18 10:36:11

标签: cordova media android-mediascanner

我有以下代码(这是一个将base64保存为手机上的图像文件的插件)

    @Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
    if (!action.equals("saveImage")) {
        return false;
    }
    try {
        String b64String = args.getString(0);
        if (b64String.startsWith("data:image")) {
            b64String = b64String.substring(b64String.indexOf(',') + 1);
        }
        JSONObject params = args.getJSONObject(1);

        //Optional parameter
        String filename = params.has("filename")
                ? params.getString("filename")
                : "drawsaur_" + System.currentTimeMillis() + ".png";

        String folder = params.has("folder")
                ? params.getString("folder")
                : Environment.getExternalStorageDirectory() + "/drawsaur";

        Boolean overwrite = params.has("overwrite") 
                ? params.getBoolean("overwrite") 
                : false;

        return this.saveImage(b64String, filename, folder, overwrite, callbackContext);

    } catch (JSONException e) {
        e.printStackTrace();
        callbackContext.error(e.getMessage());
        return false;
    } catch (InterruptedException e) {
        e.printStackTrace();
        callbackContext.error(e.getMessage());
        return false;
    }
}
private boolean saveImage(String b64String, String fileName, String dirName, Boolean overwrite, CallbackContext callbackContext) throws InterruptedException, JSONException {
    try {
        //Directory and File
        File dir = new File(dirName);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dirName, fileName);
        //Avoid overwriting a file
        if (!overwrite && file.exists()) {
         callbackContext.error("File already exists!");
            return true;
        }
        //Decode Base64 back to Binary format
        byte[] decodedBytes = Base64.decode(b64String.getBytes());
        //Save Binary file to phone
        file.createNewFile();
        FileOutputStream fOut = new FileOutputStream(file);
        fOut.write(decodedBytes);
        fOut.close();

        callbackContext.success("Saved successfully to " + dirName + "/" + fileName);
        return true;
    } catch (FileNotFoundException e) {
        callbackContext.error("File not Found!");
        return false;
    } catch (IOException e) {
        callbackContext.error(e.getMessage());
        return false;
    }
}

我需要在文件上触发媒体扫描,以便android将在库中显示该文件。我怎样才能做到这一点 ?我正在使用Phonegap 2.9.0并在nexus4上进行测试

谢谢

1 个答案:

答案 0 :(得分:1)

要从中创建一个插件,这里是

scanMedia.java

public class scanMedia extends CordovaPlugin {

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (!action.equals("mediaScanner")) {
        return false;
    }
    try {
        String absolutePath = args.getString(0);
        if (absolutePath.startsWith("data:image")) {
            absolutePath = absolutePath.substring(absolutePath.indexOf(',') + 1);
        }

        return this.mediaScanner(absolutePath, callbackContext);

    } catch (JSONException e) {
        e.printStackTrace();
        callbackContext.error(e.getMessage());
        return false;
    } catch (InterruptedException e) {
        e.printStackTrace();
        callbackContext.error(e.getMessage());
        return false;
    }
}

private boolean mediaScanner(String absolutePath, CallbackContext callbackContext) throws InterruptedException, JSONException
{
      Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
      //File f = new File(filename);

      Uri contentUri = Uri.parse(absolutePath.toString());
      mediaScanIntent.setData(contentUri);
      System.out.println("from internal?" + contentUri);
      //this.cordova.getContext().sendBroadcast(mediaScanIntent); //this is deprecated
      this.cordova.getActivity().sendBroadcast(mediaScanIntent);
      return true;
}   }

scanMedia.js

(function() {
            /* This increases plugin compatibility */
            var cordovaRef = window.PhoneGap || window.Cordova || window.cordova; // old to new fallbacks

            /**
            * The Java to JavaScript Gateway 'magic' class 
            */
            function scanMedia(){ }


            scanMedia.prototype.mediaScanner = function(string, win, fail) {
                cordovaRef.exec(win, fail, "scanMedia", "mediaScanner", [string]);
            };

            cordovaRef.addConstructor(function() {
                if (!window.plugins) {
                    window.plugins = {};
                }
                if (!window.plugins.scanMedia) {
                    window.plugins.scanMedia = new scanMedia();
                }
            });

        })();

并在config.xml文件中引用

<plugin name="scanMedia" value="org.apache.cordova.scanMedia"/>

要调用插件,您需要将file.fullPath传递给函数(you use the phonegap file reader

var theLink = fileEntry.fullPath;
    window.plugins.scanMedia.mediaScanner(theLink, 
                           function(result) {
                                console.log(result);
                           }, function(error) {
                                console.log(error);
                    });

希望它可以帮助需要媒体发现的人。如果任何人都可以为iOS做这个很棒的事情:)