調(diào)用攝像頭和相冊(cè)忠寻,音樂(lè)控制,視頻控制

注意:android7.0與7.0以下版本獲取相機(jī)拍照后的照片的路徑的方式不同澎剥,具體代碼在給我的github上锡溯,地址為https://github.com/liang1075963999/android7.0

例一:?jiǎn)?dòng)相機(jī)拍一張照片,然后將照片顯示在imageview上哑姚,代碼如下:
public class MainActivity extends AppCompatActivity {
    private Button button;
    private ImageView imageView;
    private Uri imageuri;
    public static final int TAKE_PHOTO=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file=new File(getExternalCacheDir(),"1.jpg");
                Log.i("xinxi",getExternalCacheDir()+"");//輸出內(nèi)容為:/storage/emulated/0/Android/data/com.example.liang.myapplication/cache
                if(file.exists()){//exists的中文意思是存在
                    file.delete();
                }
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(Build.VERSION.SDK_INT>=24)
                {
                    imageuri= FileProvider.getUriForFile(MainActivity.this,"com.example.liang.myapplication",file);//得到文件的uri
                    Log.i("xinxi",imageuri.toString());
                }
                else {
                    imageuri=Uri.fromFile(file);//我的手機(jī)只會(huì)執(zhí)行else里面的語(yǔ)句祭饭,說(shuō)明我的手機(jī)的sdk的版本小于24,因?yàn)槲业氖謾C(jī)是android6.0叙量,api是23倡蝙,只有android7.0及以上版本才會(huì)執(zhí)行以上的語(yǔ)句
                    Log.i("xinxi",imageuri.toString());//輸出結(jié)果為:file:///storage/emulated/0/Android/data/com.example.liang.myapplication/cache/1.jpg
                }
                Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");//啟動(dòng)相機(jī)的action是android.media.action.IMAGE_CAPTURE
                intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);//將照片的uri路徑寫入,照片就會(huì)保存在該路徑下
                startActivityForResult(intent,TAKE_PHOTO);//使用startActivityForResult啟動(dòng)的活動(dòng)绞佩,在活動(dòng)啟動(dòng)之后會(huì)給原來(lái)的活動(dòng)返回一個(gè)結(jié)果碼寺鸥,這個(gè)結(jié)果碼在onActivityResult方法中接收,來(lái)判斷是否正常啟動(dòng)了
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case TAKE_PHOTO:
                if(resultCode==RESULT_OK){
                    try {
                        Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));//讀出路徑下圖片的流品山,然后轉(zhuǎn)換為bitmap
                        imageView.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            default:
        }
    }
}

因?yàn)閍ndroid7.0中得到一個(gè)文件的uri涉及到了content provider胆建,所以需要在androidmanifest中進(jìn)行配置,內(nèi)容如下:


device-2017-11-14-182630.png
例二:從相冊(cè)中選擇圖片
public class MainActivity extends AppCompatActivity {
    private Button button;
    private ImageView imageView;
    private static final int CHOOSE_PHOTO = 2;//這里之所以是2肘交,是因?yàn)檫@個(gè)例子和例一其實(shí)是一起的笆载,但是我給分開(kāi)了,因?yàn)槔恢械腡AKE_PHOTO=1,所以這里要用2凉驻,加以區(qū)分

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    qidong();
                }
            }
        });
    }

    private void qidong() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");//啟動(dòng)手機(jī)內(nèi)容的action是android.intent.action.GET_CONTENT
        intent.setType("image/*");//設(shè)置所需手機(jī)內(nèi)容為圖片
        startActivityForResult(intent, CHOOSE_PHOTO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case CHOOSE_PHOTO:
                if (resultCode == RESULT_OK) {
                    if (Build.VERSION.SDK_INT >= 19) {
                        //4.4.及以上版本使用這個(gè)方法處理圖片
                        one(data);
                    } else {
                        //4.4.以下版本使用這個(gè)方法處理圖片
                        another(data);
                    }
                }
        }
    }

    @TargetApi(19)
    private void one(Intent intent) {
        String imagepath = null;
        Uri uri = intent.getData();
        Log.i("xinxi", "intent.getData().toString()為:" + intent.getData().toString());
        Log.i("xinxi", "uri.getAuthority()為:" + uri.getAuthority());
        Log.i("xinxi", "uri.getScheme()為:" + uri.getScheme());
      //Log日志如下:
       /* 11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A756326
        11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
        11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
        11-14 20:27:13.785 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:756326
        11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A730538
        11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
        11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
        11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:730538
        11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A124644
        11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
        11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
        11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:124644*/
        if (DocumentsContract.isDocumentUri(this, uri)) {
            String docid = DocumentsContract.getDocumentId(uri);
            Log.i("xinxi", "DocumentsContract.getDocumentId(uri)為:" + DocumentsContract.getDocumentId(uri));
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docid.split(":")[1];
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagepath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Uri contenturi = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(docid));
                imagepath = getImagePath(contenturi, null);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            imagepath = getImagePath(uri, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            imagepath = uri.getPath();
        }
        showImage(imagepath);
    }

    private void another(Intent intent) {
        Uri uri = intent.getData();
        String imagepath = getImagePath(uri, null);
        showImage(imagepath);
    }

    private void showImage(String imagepath) {
        if (imagepath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(imagepath);
            imageView.setImageBitmap(bitmap);
        } else {
            Toast.makeText(this, "沒(méi)有得到圖片", Toast.LENGTH_SHORT).show();
        }
    }

    private String getImagePath(Uri externalContentUri, String selection) {
        String path = null;
        Cursor cursor = getContentResolver().query(externalContentUri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToNext()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

例三:簡(jiǎn)單的音樂(lè)播放器
device-2017-11-14-211121.png
public class MainActivity extends AppCompatActivity {
    private Button button;
    private Button button1;
    private Button button2;
    private MediaPlayer mediaplayer = new MediaPlayer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        quanxian();
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mediaplayer.isPlaying()) {
                    mediaplayer.start();
                }
            }
        });
        button1.setOnClickListener(new View.OnClickListener()

        {
            @Override
            public void onClick(View v) {
                if (mediaplayer.isPlaying()) {
                    mediaplayer.pause();
                }
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaplayer.isPlaying()) {
                    mediaplayer.reset();
                    chushihua();
                }
            }
        });
    }

    private void quanxian() {
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        } else {
            chushihua();
        }
    }

    private void chushihua() {
        File file = new File(Environment.getExternalStorageDirectory(), "1.mp3");//要想得到手機(jī)存儲(chǔ)中任意文件的路徑就需要用到Environment腻要,如果是app的關(guān)聯(lián)緩存路徑的話直接getExternalCacheDir()
        Log.i("xinxi", "Environment.getExternalStorageDirectory()為:" + Environment.getExternalStorageDirectory() + "");
        Log.i("xinxi", "file.getPath()為" + file.getPath());
       /* Log日志輸出如下:
        11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: Environment.getExternalStorageDirectory()為:/storage/emulated/0
        11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: file.getPath()為/storage/emulated/0/1.mp3*/
        try {
            mediaplayer.setDataSource(file.getPath());
            mediaplayer.prepare();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//這個(gè)方法是當(dāng)系統(tǒng)提示用戶是否開(kāi)啟權(quán)限的時(shí),當(dāng)用戶選擇開(kāi)啟或者是禁止時(shí)觸發(fā)的
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case (1):
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)//grant是同意的意思涝登,grantResults這個(gè)參數(shù)中放的是0或者是1雄家,0表示同意,1表示禁止
                {
                    Toast.makeText(MainActivity.this, "已經(jīng)有權(quán)限了", Toast.LENGTH_SHORT).show();
                    chushihua();
                } else {
                    Toast.makeText(MainActivity.this, "請(qǐng)先申請(qǐng)權(quán)限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mediaplayer!=null){
            mediaplayer.stop();
            mediaplayer.release();
        }
    }
}

記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

例四:簡(jiǎn)單的視頻播放器
device-2017-11-14-212720.png
public class MainActivity extends AppCompatActivity {
    private Button button;
    private Button button1;
    private Button button2;
    private VideoView videoview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        videoview= (VideoView) findViewById(R.id.videoView);
        quanxian();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!videoview.isPlaying()) {
                    videoview.start();//開(kāi)始播放
                }
            }
        });
        button1.setOnClickListener(new View.OnClickListener()

        {
            @Override
            public void onClick(View v) {
                if (videoview.isPlaying()) {
                    videoview.pause();//暫停播放
                }
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (videoview.isPlaying()) {
                    videoview.resume();//重新播放
                }
            }
        });
    }

    private void quanxian() {
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        } else {
            chushihua();
        }
    }

    private void chushihua() {
        File file = new File(Environment.getExternalStorageDirectory(), "mo.mp4");//要想得到手機(jī)存儲(chǔ)中任意文件的路徑就需要用到Environment胀滚,如果是app的關(guān)聯(lián)緩存路徑的話直接getExternalCacheDir()
        Log.i("xinxi", "Environment.getExternalStorageDirectory()為:" + Environment.getExternalStorageDirectory() + "");
        Log.i("xinxi", "file.getPath()為" + file.getPath());
       /* Log日志輸出如下:
        11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: Environment.getExternalStorageDirectory()為:/storage/emulated/0
        11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: file.getPath()為/storage/emulated/0/mo.mp4*/
        videoview.setVideoPath(file.getPath());
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//這個(gè)方法是當(dāng)系統(tǒng)提示用戶是否開(kāi)啟權(quán)限的時(shí)趟济,當(dāng)用戶選擇開(kāi)啟或者是禁止時(shí)觸發(fā)的
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case (1):
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)//grant是同意的意思,grantResults這個(gè)參數(shù)中放的是0或者是1蛛淋,0表示同意咙好,1表示禁止
                {
                    Toast.makeText(MainActivity.this, "已經(jīng)有權(quán)限了", Toast.LENGTH_SHORT).show();
                    chushihua();
                } else {
                    Toast.makeText(MainActivity.this, "請(qǐng)先申請(qǐng)權(quán)限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(videoview!=null){
            videoview.suspend();
        }
    }
}

記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市褐荷,隨后出現(xiàn)的幾起案子勾效,更是在濱河造成了極大的恐慌,老刑警劉巖叛甫,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件层宫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡其监,警方通過(guò)查閱死者的電腦和手機(jī)萌腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抖苦,“玉大人毁菱,你說(shuō)我怎么就攤上這事⌒坷” “怎么了贮庞?”我有些...
    開(kāi)封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)究西。 經(jīng)常有香客問(wèn)我窗慎,道長(zhǎng),這世上最難降的妖魔是什么卤材? 我笑而不...
    開(kāi)封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任遮斥,我火速辦了婚禮,結(jié)果婚禮上扇丛,老公的妹妹穿的比我還像新娘术吗。我一直安慰自己,他們只是感情好帆精,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布藐翎。 她就那樣靜靜地躺著材蹬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吝镣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天昆庇,我揣著相機(jī)與錄音末贾,去河邊找鬼。 笑死整吆,一個(gè)胖子當(dāng)著我的面吹牛拱撵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播表蝙,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拴测,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了府蛇?” 一聲冷哼從身側(cè)響起集索,我...
    開(kāi)封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汇跨,沒(méi)想到半個(gè)月后务荆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穷遂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年函匕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚪黑。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盅惜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忌穿,到底是詐尸還是另有隱情抒寂,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布伴网,位于F島的核電站蓬推,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澡腾。R本人自食惡果不足惜沸伏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望动分。 院中可真熱鬧毅糟,春花似錦、人聲如沸澜公。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迹辐,卻和暖如春蝶防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背明吩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工间学, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人印荔。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓低葫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仍律。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘿悬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)水泉,斷路器善涨,智...
    卡卡羅2017閱讀 134,719評(píng)論 18 139
  • 我們平時(shí)在使用QQ或微信的時(shí)候經(jīng)常要和別人分享圖片,這些圖片可以是用手機(jī)攝像頭拍的茶行,也可以是從相冊(cè)中選取的...
    AndYMJ閱讀 1,699評(píng)論 0 2
  • 原文鏈接http://www.cnblogs.com/kenshincui/p/4186022.html 音頻在i...
    Hyman0819閱讀 21,722評(píng)論 4 74
  • 那時(shí)候伯铣,天還很藍(lán) 溪水比現(xiàn)在更加的清涼 夏風(fēng)也很溫柔 我們都喜歡躺在青草地上 那時(shí)候呻此,路還不長(zhǎng) 車輛比現(xiàn)在少 但追...
    Josan喬閱讀 202評(píng)論 4 7