Java:列出已插入的摄像头

时间:2011-06-27 19:54:10

标签: java camera device

我的程序目前获得了一个使用File.listRoots()插入计算机的驱动器列表。但是,当我将相机或MP3播放器直接插入计算机(而不是插入存储卡)时,它没有列出,也没有Windows资源管理器中的驱动器号。例如,这是我的相机的位置:

Computer\Canon PowerShot SD750\Removable storage

如何列出没有驱动器号的相机/其他设备?我认为这将需要某种类型的JNI库,但我显然不确定。

谢谢!

P.S。出于绝望,我做了尝试列出Computer\的内容;它当然不起作用。


更新:我在这里找到了这个问题:Portable Device Path on Windows;这正是我遇到的问题,但那里没有解决方案。

4 个答案:

答案 0 :(得分:2)

Java 7在这个领域有一些看起来很有前途的类,比如这个: http://download.java.net/jdk7/docs/api/java/nio/file/FileSystem.html

假设您需要它也可以在Java 6上运行,我建议运行shell脚本并解析其输出。 在Windows上你可以在Unix / MacOS X mount等上运行mountvol。当然解析输出会有些乏味,你不得不担心你的app运行的每个操作系统,但是嘿,至少......不确定是什么。 ......它有效吗?

Here是一些示例代码,在Windows上看起来很有用:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * from Win32_Volume")

For Each objItem In colItems
    WScript.Echo "Automount: " & objItem.Automount
    WScript.Echo "Block Size: " & objItem.BlockSize
    WScript.Echo "Capacity: " & objItem.Capacity
    WScript.Echo "Caption: " & objItem.Caption
    WScript.Echo "Compressed: " & objItem.Compressed
    WScript.Echo "Device ID: " & objItem.DeviceID
    WScript.Echo "Dirty Bit Set: " & objItem.DirtyBitSet
    WScript.Echo "Drive Letter: " & objItem.DriveLetter
    WScript.Echo "Drive Type: " & objItem.DriveType
    WScript.Echo "File System: " & objItem.FileSystem
    WScript.Echo "Free Space: " & objItem.FreeSpace
    WScript.Echo "Indexing Enabled: " & objItem.IndexingEnabled
    WScript.Echo "Label: " & objItem.Label
    WScript.Echo "Maximum File Name Length: " & objItem.MaximumFileNameLength
    WScript.Echo "Name: " & objItem.Name
    WScript.Echo "Quotas Enabled: " & objItem.QuotasEnabled
    WScript.Echo "Quotas Incomplete: " & objItem.QuotasIncomplete
    WScript.Echo "Quotas Rebuilding: " & objItem.QuotasRebuilding
    WScript.Echo "Serial Number: " & objItem.SerialNumber
    WScript.Echo "Supports Disk Quotas: " & objItem.SupportsDiskQuotas
    WScript.Echo "Supports File-Based Compression: " & _
        objItem.SupportsFileBasedCompression
    WScript.Echo
Next

以下是我为电子书阅读器输出的内容:

Automount: True
Block Size: 4096
Capacity: 999120896
Caption: G:\
Compressed: 
Device ID: \\?\Volume{8e3b4ce5-a124-11e0-9d2b-e30c5839642d}\
Dirty Bit Set: False
Drive Letter: G:
Drive Type: 2
File System: FAT32
Free Space: 663683072
Indexing Enabled: 
Label: PocketBook9
Maximum File Name Length: 255
Name: G:\
Quotas Enabled: 
Quotas Incomplete: 
Quotas Rebuilding: 
Serial Number: 1276177233
Supports Disk Quotas: False
Supports File-Based Compression: False

答案 1 :(得分:1)

使用JMTP库

解决上述问题
http://code.google.com/p/jmtp/

这是我的代码

    package jmtp;

import be.derycke.pieter.com.COMException;
import be.derycke.pieter.com.Guid;
import java.io.*;
import java.math.BigInteger;
import jmtp.PortableDevice;
import jmtp.*;

public class Jmtp {

    public static void main(String[] args) {
        PortableDeviceManager manager = new PortableDeviceManager();
        PortableDevice device = manager.getDevices()[0];
        // Connect to my mp3-player
        device.open();

        System.out.println(device.getModel());

        System.out.println("---------------");

        // Iterate over deviceObjects
        for (PortableDeviceObject object : device.getRootObjects()) {
            // If the object is a storage object
            if (object instanceof PortableDeviceStorageObject) {
                PortableDeviceStorageObject storage = (PortableDeviceStorageObject) object;

                for (PortableDeviceObject o2 : storage.getChildObjects()) {
//                    
//                        BigInteger bigInteger1 = new BigInteger("123456789");
//                        File file = new File("c:/JavaAppletSigningGuide.pdf");
//                        try {
//                            storage.addAudioObject(file, "jj", "jj", bigInteger1);
//                        } catch (Exception e) {
//                            //System.out.println("Exception e = " + e);
//                        }
//                    

                    System.out.println(o2.getOriginalFileName());
                }
            }
        }

        manager.getDevices()[0].close();

    }
}

不要忘记添加jmtp.dll文件(提供jmtp下载)作为本地库以获取更多信息,请参阅我的回答

{{1}}

答案 2 :(得分:0)

这可能不是您正在寻找的答案,但是将它们分配给驱动器号而不是选项?您通常可以使用“我的电脑”>在Windows上使用USB设备手动执行此操作。右键单击>管理>存储

可能 JMF中的CaptureDeviceManager(java媒体框架)可以帮到你,但我有点怀疑。

答案 3 :(得分:0)

也许你可以看看Morena Framework http://www.gnome.sk/Twain/jtp.htmlv(似乎是开源的,但有点贵;虽然有一个免费的评估版),它适用于TWAIN兼容的扫描仪/摄像头(Windows / MAC) )或SANE兼容(Linux或其他unix风格),要获得连接设备列表,您可以这样做:

import SK.gnome.morena.*;
import SK.gnome.twain.*;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        TwainSource[] sources=TwainManager.listSources();
        if(sources == null) return;
        for(int i = 0; i < sources.length; i++)
        {
            System.out.println("Twain source is: " + ts.toString());
        }
    }
}

也许这可能有所帮助,如果不是,我认为JMF可能是一种可能的解决方案。